J'ai un MongoDB avec Express qui sert les données sur un point de terminaison, accessible par React's USEEFFEFPECT CODE>:
console.log(data === respData);
console.log(data);
console.log(respData);
3 Réponses :
Parce que dans JS: P>
Les primitives telles que des chaînes et des chiffres sont comparées par leur valeur, tandis que des objets comme des tableaux, des dates et des objets simples sont comparés par leur référence. P> blockQuote>
et puisque ces 2 objets sont 2 objets différents, ils n'ont pas la même références p>
OK, puis-je faire useeffect code> comparer la valeur et non référence?
@Cisforcookies probablement Cette réponse vous aidera
Probablement, car @ @ Berto99 mentionné, des objets sont comparés par référence.
Ce que vous pouvez faire, c'est de convertir les deux objets vers des chaînes, puis de les comparer, Ce n'est pas l'option la plus sûre, mais pour des objets simples, cela devrait faire. Je vous laisse décider si c'est assez bon. P> p>
Il y a deux choses à discuter ici - p>
Lorsqu'un état est mentionné dans la matrice de dépendance d'un réact code> useEffect code> est une comparaison de la matrice de dépendance à vérifier si le rappel doit être appelé. P>
Toutefois, si un objet est mentionné dans la matrice de dépendance, qui est renouvelé chaque rendu, même si leurs propriétés sont inchangées, elles seront comparées par référence et effet seront appelés, comme dans votre cas. P>
Le problème est adressé par Kent C. Dodds et il a introduit un accrochage alternatif à L'utilisation est exactement similaire à Pour plus de détails - Découvrez ce lien . P> useeffect code>, et nous essayons de mettre à jour l'état à l'intérieur de celui sans condition de prévention, il en résulte une boucle infinie.
USEEFFECT CODE> ->
Mise à jour de l'état CODE> ->
useEffect code> et cela continue. P>
Comparaison peu profonde h3>
useeffect code> -
acepesepcompeeffect code>. p>.
useeffect code>, et cela ferait exactement ce qu'il semble. Il déclenchera le rappel uniquement après la comparaison en profondeur de l'objet dans la matrice de dépendance. P>
En réalité, cela ne fonctionne pas comme prévu, car maintenant le Tableata code> reste toujours le même, même si la récupération produirait une nouvelle valeur, ce qui signifie que lorsque la DB met à jour, le réact ne reflète pas que J'utilise l'original
useeffect code>
La cause première du re-rendu est la suivante: la mise à jour des données à l'intérieur de l'USEEFFECT tout en ayant des données dans le cadre de la matrice de dépendance. Pouvez-vous expliquer l'Usecase et pourquoi vous utilisez des données dans la matrice de dépendance. Il pourrait y avoir une solution alternative pour y parvenir.
Parce que l'égalité sur les objets dans JS n'a pas été effectuée en vérifiant la valeur du conteneur, mais la référence?
Dupe de Stackoverflow.com/q/33299889/3001761
Peut-être Ce vous aiderait à comparer l'objet en profondeur à l'aide du crochet UseEffect.
@Himayan meilleure option jusqu'à présent. Tu veux le changer à une réponse?
Sûr. Donne-moi juste une minute.
Le problème est que vous modifiez l'état à l'intérieur de l'USEEFFET et en utilisant cet état comme une dépendance pour l'userFEffect, cela provoquera toujours une boucle infinie. Donc, la comparaison de l'objet par référence ne résoudra rien, il va simplement vous dire que les objets sont en effet égaux