0
votes

Réagir des crochets useeffect

J'ai un problème avec mon application en ce sens qu'elle rend une nouvelle blague deux fois lorsque je clique sur la nouvelle fonction du bouton. Voici mon code:

    import React, { useState, useEffect } from "react";
import { Typography, Button } from "@material-ui/core";

import Navigation from "../Navigation";
export default function RandomJoke() {
  const [isLoaded, setLoaded] = useState(false);
  const [jokeData, setJokeData] = useState({});
  const [loadNewJoke, setLoadNewJoke] = useState(false);

  function useFetch() {
    async function fetchMyAPI() {
      let response = await fetch("https://icanhazdadjoke.com/slack");
      response = await response.json();
      setJokeData(response);
      setLoaded(true);
    }

    useEffect(() => {
      fetchMyAPI();
      if (loadNewJoke) setLoadNewJoke(false);
    }, [loadNewJoke]);
  }
  useFetch();

  function reloadJoke() {
    setLoaded(false);
    setLoadNewJoke(true);
  }

  return (
    <>
      <Navigation mainpage="RandomJoke" />

      <Typography variant="h6">Random Dad Joke</Typography>
      {isLoaded && <div>{jokeData.attachments[0].text}</div>}
      {!isLoaded && <div>loading...</div>}
      {isLoaded && (
        <Button variant="contained" onClick={() => reloadJoke()}>
          New one
        </Button>
      )}
    </>
  );
}


1 commentaires

Pour relier les choses, parce que c'est à peu près la même question (bien que l'autre n'a pas trop de détails) - Stackoverflow.com/questions/58575722/...


4 Réponses :


1
votes

que UseEffect déclenche chaque fois que la valeur de loadnewjoke change, non? Pas seulement lorsque loadnewjoke est défini sur true. Examinez attentivement les appels effectués après une touche, appuyez sur le bouton, et combien de fois setlartNewjoke est appelé.


4 commentaires

Ouais je suis à peu près sûr que ça fait, comme je l'ai ajouté à l'intérieur de []. Juste une sorte de nécessité de travailler la logique pour qu'il ne tire qu'une seule fois, mais également la définition correctement sur la première charge, puis nouvelle charge


Je voudrais simplement mettre la vérification autour de fetchmyapi - L'USEEEFFECT déclenchera chaque changement, alors appelez l'API si sa valeur actuelle est vraie.


Mettre ce chèque et installer dans mon fetchmyapi encore rendez-vous deux fois, ou avez-vous voulu dire autour d'elle comme à Fetchmyapi est à l'intérieur du chèque?


Je veux dire autour de Fetchmyapi - de sorte que si vous utilisez des incendies, la récupération () est uniquement appelée si la valeur actuelle de LoadNewjoke est vraie.



0
votes

Essayez de déplacer:

if (loadNewJoke) setLoadNewJoke(false);


2 commentaires

Mettre ce chèque et mis dans mon fetchmyapi encore rendez-vous deux fois


Déclencher simplement votre fonction Async directement dans votre rappel et votre code sera de 30% plus propre




0
votes

J'ai suivi ce que Andom Miltev a dit de déclencher la fonction ASYNC directement dans mon rappel et cela fonctionne maintenant en douceur - merci à tous pour l'aide :)

    import React, { useState, useEffect } from "react";
import { Typography, Button } from "@material-ui/core";

import Navigation from "../Navigation";
export default function RandomJoke() {
  const [isLoaded, setLoaded] = useState(false);
  const [jokeData, setJokeData] = useState({});

  async function fetchMyAPI() {
    setLoaded(false);
    let response = await fetch("https://icanhazdadjoke.com/slack");
    response = await response.json();
    setJokeData(response);
    setLoaded(true);
    console.log("fired 1");
  }

  useEffect(() => {
    fetchMyAPI();
  }, []);

  return (
    <>
      <Navigation mainpage="RandomJoke" />

      <Typography variant="h6">Random Dad Joke</Typography>
      {isLoaded && <div>{jokeData.attachments[0].text}</div>}
      {!isLoaded && <div>loading...</div>}
      {isLoaded && (
        <Button variant="contained" onClick={() => fetchMyAPI()}>
          New one
        </Button>
      )}
    </>
  );
}


1 commentaires

Voir, c'est ce que je voulais dire :) useEffect, et tous les crochets, devraient toujours utiliser. J'ai noté que "n'appelez pas les crochets à l'intérieur des boucles, des conditions ou des fonctions imbriquées. Au lieu de toujours utiliser des crochets au niveau supérieur de votre fonction réactive . "