J'ai essayé de résoudre ce problème, mais quelle que soit la solution que je fais, elle est toujours bloquée dans une boucle infinie.
Voici le code
const [carr, setCarr] = useState({}) useEffect(() => { sortedRosterCollection.once('value', (snap) => { snap.forEach((doc) =>{ if (doc.key==="Carr Intermediate"){ var school = doc.key; var mentorList = doc.val(); var schoolMentor = {school:school, mentors: mentorList}; setCarr(schoolMentor) console.log(carr) } }); }); },[carr]);
Quoi que je fasse, "console.log (carr)" est déclenché à l'infini.
3 Réponses :
Si vous souhaitez inspecter la valeur de carr
chaque fois qu'elle est modifiée, mettez-la dans un autre effet d'utilisation:
const [carr, setCarr] = useState({}) useEffect(() => { sortedRosterCollection.once('value', (snap) => { snap.forEach((doc) => { if (doc.key === "Carr Intermediate") { var school = doc.key; var mentorList = doc.val(); var schoolMentor = { school: school, mentors: mentorList }; setCarr(schoolMentor) } }); }); }, []); useEffect(() => { console.log(carr) }, [carr])
Vous n’oubliez pas la fonction de nettoyage dans useEffect hook comme ceci:
useEffect(() => { effect return () => { cleanup } }, [input])
J'avais l'habitude de faire ce problème comme vous parce que useEffect peut comparer deux objets. Vous pouvez faire la référence au lien: https: / /medium.com/javascript-in-plain-english/comparing-objects-in-javascript-ce2dc1f3de7f . Et je vérifie les modifications en utilisant le code ci-dessous:
function usePrevious(value) { const ref = useRef(); useEffect(() => { ref.current = value; }); return ref.current; }
Vous définissez la valeur
carr
dans le même useEffect qui est déclenché lorsquecarr
est modifié, provoquant une boucle infinie. Vous ne voyez pas pourquoi vous devez l'avoir dans la liste des dépendances.