0
votes

les données extraites sont différentes des données anciennes, mais semble exactement la même chose

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);


6 commentaires

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


3 Réponses :


3
votes

Parce que dans JS:

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.

et puisque ces 2 objets sont 2 objets différents, ils n'ont pas la même références


2 commentaires

OK, puis-je faire useeffect comparer la valeur et non référence?


@Cisforcookies probablement Cette réponse vous aidera



0
votes

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, xxx

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.


0 commentaires

2
votes

Il y a deux choses à discuter ici -

boucle infinie

Lorsqu'un état est mentionné dans la matrice de dépendance d'un useeffect , 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 -> Mise à jour de l'état -> useEffect et cela continue.

Comparaison peu profonde

réact useEffect est une comparaison de la matrice de dépendance à vérifier si le rappel doit être appelé.

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.

Le problème est adressé par Kent C. Dodds et il a introduit un accrochage alternatif à useeffect - acepesepcompeeffect . .

L'utilisation est exactement similaire à useeffect , 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.

Pour plus de détails - Découvrez ce lien .


2 commentaires

En réalité, cela ne fonctionne pas comme prévu, car maintenant le Tableata 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


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.