płytkie porównanie ma miejsce wtedy, gdy właściwości porównywanych obiektów są wykonywane przy użyciu „===” lub ścisłej równości i nie prowadzą do głębszych porównań we właściwościach. np
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
}
}
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);
Chociaż oba obiekty wydają się być takie same, game_item.teamsnie jest tym samym odniesieniem, co updated_game_item.teams. Aby 2 obiekty były takie same, powinny wskazywać na ten sam obiekt. W ten sposób skutkuje to aktualizacją ocenianego stanu
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
Tym razem każda z właściwości zwraca wartość true dla ścisłego porównania, ponieważ właściwość zespołów w nowym i starym obiekcie wskazuje na ten sam obiekt.
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item);
updated_game_item3.first_world_cupNieruchomość nie ścisła ocena jak 1930 jest liczbą natomiast game_item.first_world_cupjest ciągiem. Gdyby porównanie było luźne (==), to by minęło. Niemniej jednak spowoduje to również aktualizację stanu.
Dodatkowe uwagi:
- Przeprowadzanie głębokiego porównania jest bezcelowe, ponieważ znacząco wpłynęłoby na wydajność, gdyby obiekt stanu był głęboko zagnieżdżony. Ale jeśli nie jest zbyt zagnieżdżony i nadal potrzebujesz głębokiego porównania, zaimplementuj go w shouldComponentUpdate i sprawdź, czy to wystarczy.
- Zdecydowanie można bezpośrednio zmienić obiekt stanu, ale stan komponentów nie zostanie zmieniony, ponieważ w przepływie metody setState, która reaguje, implementuje punkty zaczepienia cyklu aktualizacji składnika. Jeśli aktualizujesz obiekt stanu bezpośrednio, aby celowo unikać haków cyklu życia komponentu, prawdopodobnie powinieneś używać prostej zmiennej lub obiektu do przechowywania danych, a nie obiektu stanu.