Javascript-forum
ein Object mit react in einem anderen div anwenden - Druckversion

+- Javascript-forum (https://javascript-forum.de)
+-- Forum: Javascript allgemeiner (https://javascript-forum.de/forumdisplay.php?fid=16)
+--- Forum: React (https://javascript-forum.de/forumdisplay.php?fid=19)
+--- Thema: ein Object mit react in einem anderen div anwenden (/showthread.php?tid=2318)



ein Object mit react in einem anderen div anwenden - sfthbara - 20.04.2023

Also ich verwende on Click in FactList Fact, um per click ein Aside (CategoryFilter erscheinen zu lassen. Im aside ist einfach nur eine Auflistung mit Daten. Dort würde ich gerne den innertext in den spans ändern.
In javascript würde ich das aside element (<p id="demo"> test</p>) aufrufen und (document.getelementbyid("demo").innertext = fact.property) nutzen. Wie sollte man das in React machen? Man könnte auch den key nutzen und diesen mit den den "global" verfügbaren facts vergleichen. Mit props habe ich es auch nicht geschafft, fact in im Aside (CategoryFilter) aufzurufen.



function App() {
  const [showForm, setShowForm] = useState(false);
  const [showAside, setShowAside] = useState(false);
  const [facts, setFacts] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  const [currentCategory, setCurrentCategory] = useState("all");

  useEffect(
    function () {
      async function getFacts() {
        setIsLoading(true);

        let query = supabase.from("facts").select("*");

        if (currentCategory !== "all")
          query = query.eq("category", currentCategory);

        const { data: facts, error } = await query
          .order("votesInteresting", { ascending: false })
          .limit(1000);

        if (!error) setFacts(facts);
        else alert("There was a problem getting data");
        setIsLoading(false);
      }
      getFacts();
    },
    [currentCategory]
  );

  return (
    <>
      <Header showForm={showForm} setShowForm={setShowForm} />
      {showForm ? (
        <NewFactForm setFacts={setFacts} setShowForm={setShowForm} />
      ) : null}

      <main className="main">
        {showAside ? (
          <CategoryFilter
            factobject={facts}
            setCurrentCategory={setCurrentCategory}
          />
        ) : null}

        {isLoading ? (
          <Loader />
        ) : (
          <FactList
            showAside={showAside}
            setShowAside={setShowAside}
            facts={facts}
            setFacts={setFacts}
          />
        )}
      </main>
    </>
  );
}



function FactList({ facts, setFacts, showAside, setShowAside }) {
  if (facts.length === 0)
    return (
      <p className="message">
        No facts for this category yet! Create the first one ✌️
      </p>
    );

  return (
    <section>
      <ul className="facts-list">
        {facts.map((fact) => (
          <Fact
            key={fact.id}
            showAside={showAside}
            setShowAside={setShowAside}
            fact={fact}
            setFacts={setFacts}
          />
        ))}
      </ul>
      <p>There are {facts.length} facts in the database. Add your own!</p>
    </section>
  );
}

function Fact({ fact, setFacts, showAside, setShowAside }) {
  console.log(fact);
  const [isUpdating, setIsUpdating] = useState(false);
  const [artistt, setArtistt] = useState(null);
  const isDisputed =
    fact.votesInteresting + fact.votesMindblowing < fact.votesFalse;

  async function handleVote(columnName) {
    setIsUpdating(true);
    const { data: updatedFact, error } = await supabase
      .from("facts")
      .update({ [columnName]: fact[columnName] + 1 })
      .eq("id", fact.id)
      .select();
    setIsUpdating(false);

    if (!error)
      setFacts((facts) =>
        facts.map((f) => (f.id === fact.id ? updatedFact[0] : f))
      );
  }

  return (
    <li
      className="fact"
      onClick={() => console.log(fact)}
      onDoubleClick={() => setShowAside((showAside) => !showAside)}
    >
      <div className="fact-info-short">
        {isDisputed ? <span className="disputed">[⛔️ DISPUTED]</span> : null}{" "}
        <p>{fact.artist}</p>
        <span
          className="tag"
          style={{
            backgroundColor: CATEGORIES_ART.find(
              (cat) => cat.name === fact.category
            ).color,
          }}
        >
          {fact.category}
        </span>
        <div className="vote-buttons">
          <button
            onClick={() => handleVote("votesInteresting")}
            disabled={isUpdating}
          >
            👍 {fact.votesInteresting}
          </button>
          <button
            onClick={() => handleVote("votesMindblowing")}
            disabled={isUpdating}
          >
            🤯 {fact.votesMindblowing}
          </button>
          <button
            onClick={() => handleVote("votesFalse")}
            disabled={isUpdating}
          >
            ⛔️ {fact.votesFalse}
          </button>
        </div>
      </div>
    </li>
  );
}



RE: ein Object mit react in einem anderen div anwenden - rzscout - 20.04.2023

Hi sfthbara,
wenn du einen Thread eröffnest und Code einfügst dann bitte die Textoption Code einfügen verwenden. Es ist nämlich schwierig das zu lesen, da du den Code direkt als Text eingefügt hast. Zwar erkennt zum Teil des Forums die Formatierung, aber um es leserlich zu gestalten, solltest du es als Code einfügen.

Ich werde mir das mal genauer anschauen.

Viele Grüße

rzscout