Ein flacher Vergleich liegt vor, wenn die Eigenschaften der zu vergleichenden Objekte mit "===" oder strikter Gleichheit durchgeführt werden und keine tieferen Vergleiche der Eigenschaften durchgeführt werden. für zB
// a simple implementation of the shallowCompare.
// only compares the first level properties and hence shallow.
// state updates(theoretically) if this function returns true.
function shallowCompare(newObj, prevObj){
for (key in newObj){
if(newObj[key] !== prevObj[key]) return true;
}
return false;
}
//
var game_item = {
game: "football",
first_world_cup: "1930",
teams: {
North_America: 1,
South_America: 4,
Europe: 8
}
}
// Case 1:
// if this be the object passed to setState
var updated_game_item1 = {
game: "football",
first_world_cup: "1930",
teams: {
North_America: 1,
South_America: 4,
Europe: 8
}
}
shallowCompare(updated_game_item1, game_item); // true - meaning the state
// will update.
Obwohl beide Objekte gleich zu sein scheinen, game_item.teams
ist dies nicht die gleiche Referenz wie updated_game_item.teams
. Damit 2 Objekte gleich sind, sollten sie auf dasselbe Objekt zeigen. Dies führt also dazu, dass der zu bewertende Zustand aktualisiert wird
// Case 2:
// if this be the object passed to setState
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item); // false - meaning the state
// will not update.
Diesmal gibt jede der Eigenschaften für den strengen Vergleich true zurück, da die Team-Eigenschaft im neuen und alten Objekt auf dasselbe Objekt verweist.
// Case 3:
// if this be the object passed to setState
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item); // true - will update
Die updated_game_item3.first_world_cup
Eigenschaft besteht die strenge Bewertung nicht, da 1930 eine Zahl ist, während game_item.first_world_cup
es sich um eine Zeichenfolge handelt. Wäre der Vergleich locker gewesen (==), wäre dies vorbei. Dies führt jedoch auch zu einer Statusaktualisierung.
Zusätzliche Bemerkungen:
- Ein tiefer Vergleich ist sinnlos, da dies die Leistung erheblich beeinträchtigen würde, wenn das Statusobjekt tief verschachtelt ist. Wenn es jedoch nicht zu verschachtelt ist und Sie dennoch einen umfassenden Vergleich benötigen, implementieren Sie es in shouldComponentUpdate und prüfen Sie, ob dies ausreicht.
- Sie können das Statusobjekt definitiv direkt mutieren, aber der Status der Komponenten wird nicht beeinflusst, da er im setState-Methodenfluss, der reagiert, die Hooks für den Komponentenaktualisierungszyklus implementiert. Wenn Sie das Statusobjekt direkt aktualisieren, um die Hooks des Komponentenlebenszyklus absichtlich zu vermeiden, sollten Sie wahrscheinlich eine einfache Variable oder ein einfaches Objekt zum Speichern der Daten und nicht des Statusobjekts verwenden.