Utilisation de useEffect et de reactStrictMode : optimisation des composants React pour les performances et la fiabilité
P粉739706089
P粉739706089 2023-08-18 16:06:50
0
1
488

J'ai un défi, je souhaite charger une partie du tableau dans un nouveau tableau appelé "loadedData" et afficher uniquement les données chargées car le composant est très lourd.

Cependant, lors du premier chargement, j'ai rencontré beaucoup de problèmes car useEffect semblait tout gâcher. Le premier chargement se produit deux fois et les premières données sont insérées dans le tableau une fois pour chaque rendu. Si je supprime "reactStrictMode", cela fonctionne comme prévu, mais je ne veux pas "tricher" sans comprendre les conséquences. Quelqu'un qui comprend le problème mieux que moi l'a posé là pour une raison.

L'état isLoading ne peut pas empêcher une seconde exécution lors du chargement initial - c'est une suggestion que j'ai reçue dans d'autres discussions liées à ce problème.

Est-ce que quelqu'un sait pourquoi le premier useEffect ignore l'état isLoading et comment le gérer ?

// Essayez de charger la partie visible, mais n'en chargez pas plus const [loadedData, setLoadedData] = useState([]); const [isLoading, setIsLoading] = useState(false); const addMoreData = async () => if (loadedData.length >= data.length) renvoie ; const startIndex =loadData.length; const préféréLoadLength = 1; const endIndex = startIndex + PreferredLoadLength ; const newData = data.slice(startIndex, endIndex); setLoadedData((prev) => [...prev, ...newData]); } ; // Vérifiez si le tableau a défilé vers le bas après le montage et la récupération des données et doit immédiatement récupérer plus de données useEffect(() => { const { scrollHeight, scrollTop, clientHeight } = tableContainerRef.current; si ( scrollHeight == clientHeight && scrollTop == 0 && chargéData.length < ) { const addNewDataFunction = async () => si (est en cours de chargement) { retour; } setIsLoading(true); attendre addMoreData(); setIsLoading(faux); } ; addNewDataFunction(); } // eslint-disable-next-line réagir-hooks/exhaustive-deps }, [data.length,loadedData.length, isLoading]);


P粉739706089
P粉739706089

répondre à tous (1)
P粉183077097

Vous pouvez simplement modifier cette ligne dans la fonctionaddMoreData

setLoadedData((prev) => [...prev, ...newData]);

pour

setLoadedData([...loadedData, ...newData]);

Cela entraînera la mise à jour de l'état en fonction de la valeur actuelle lors du rendu, car la deuxième foisuseEffect运行时组件尚未重新渲染,所以第一个组件所做的更改尚未反映出来,因此loadedDatail n'a pas encore été mis à jour.

Lorsque vous mettez à jour en utilisant le formulaire fonctionnel,prevest la valeur live de l'état, il est normal que vous rencontriez cela lors de l'utilisation du mode strict en développement.

Enfin, débarrassez-vous deisLoading, cela n'aidera pas à résoudre le problème.

Remarque :L'utilisation de la forme fonctionnelle de setState est plus recommandée lorsque le mode strict est activé, mais n'est pas recommandée dansuseEffectcar ce hook s'exécutera deux fois lorsque le composant est monté.
De plus, lorsque vous incluezdata.lengthetloadedData.lengthdans votre tableau de dépendances, cela entraînera le déclenchement dedata.lengthloadedData.length时,这将使useEffectchaque fois que l'une de ces valeurs change.

    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!