Dans cette documentation de React, il est dit que
shallowCompare effectue une vérification d'égalité superficielle sur les objets props et nextProps actuels ainsi que sur les objets état actuel et nextState.
La chose que je ne peux pas comprendre est que si elle compare les objets de manière superficielle, la méthode shouldComponentUpdate retournera toujours true, car
Nous ne devons pas muter les États.
et si nous ne modifions pas les états, la comparaison retournera toujours false et la mise à jour shouldComponent retournera toujours true. Je ne sais pas comment cela fonctionne et comment allons-nous passer outre cela pour améliorer les performances.
la source
La comparaison superficielle se produit lorsque les propriétés des objets comparés sont effectuées en utilisant "===" ou une égalité stricte et ne conduisent pas de comparaisons plus profondément dans les propriétés. par exemple
Bien que les deux objets semblent être identiques, ce
game_item.teams
n'est pas la même référence queupdated_game_item.teams
. Pour que 2 objets soient identiques, ils doivent pointer vers le même objet. Il en résulte que l'état évalué doit être mis à jourCette fois, toutes les propriétés renvoient true pour la comparaison stricte, car la propriété teams dans le nouvel et l'ancien objet pointe vers le même objet.
La
updated_game_item3.first_world_cup
propriété échoue à l'évaluation stricte car 1930 est un nombre tandis quegame_item.first_world_cup
est une chaîne. Si la comparaison avait été lâche (==), cela aurait passé. Néanmoins, cela entraînera également une mise à jour de l'état.Notes complémentaires:
la source
prevObj
contient une clé quinewObj
n'en a pas, la comparaison échouera.la source
Il existe également une explication héritée de la comparaison superficielle dans React:
UPD : La documentation actuelle dit à propos de la comparaison superficielle:
UPD2: Je pense que la réconciliation est également un thème important pour une compréhension superficielle des comparaisons.
la source
L'extrait d'égalité peu profond de @supi ci-dessus ( https://stackoverflow.com/a/51343585/800608 ) échoue s'il
prevObj
possède une clé quinewObj
n'en a pas. Voici une implémentation qui devrait en tenir compte:Notez que ce qui précède ne fonctionne pas dans l'Explorateur sans polyfills.
la source
Il existe une implémentation avec des exemples.
la source