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> )} </> ); }
4 Réponses :
que UseEffect déclenche chaque fois que la valeur de loadnewjoke code> change, non? Pas seulement lorsque
loadnewjoke code> est défini sur true. Examinez attentivement les appels effectués après une touche, appuyez sur le bouton, et combien de fois
setlartNewjoke code> est appelé. P>
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 code> - 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.
Essayez de déplacer:
if (loadNewJoke) setLoadNewJoke(false);
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
Vous utilisez userFEffect TLB, je vous suggère de jeter un coup d'oeil à la Règles des crochets < / a> p>
Ne pas appeler des crochets à l'intérieur des boucles, des conditions ou des fonctions imbriquées. P>
blockQuote>
Désolé j'ai lu que, mais je n'ai toujours pas ce que je fais mal? Pourriez-vous s'il vous plaît élaborer ce que je devrais faire
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> )} </> ); }
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 . "
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/...