얕은 비교는 비교되는 객체의 속성이 "==="또는 완전 동일성을 사용하여 수행되고 속성에 대한 더 깊은 비교를 수행하지 않는 경우입니다. 예를 들어
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);
두 객체가 모두 동일하게 보이지만은와 game_item.teams
같은 참조가 아닙니다 updated_game_item.teams
. 두 개체가 동일하려면 동일한 개체를 가리켜 야합니다. 따라서 상태가 업데이트되도록 평가됩니다.
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
이번에는 새 개체와 이전 개체의 팀 속성이 동일한 개체를 가리 키므로 모든 속성이 엄격한 비교를 위해 true를 반환합니다.
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item);
updated_game_item3.first_world_cup
속성하면서 1930 엄격한 평가는 숫자에 실패 game_item.first_world_cup
문자열입니다. 비교가 느슨하다면 (==) 이것은 통과되었을 것입니다. 그럼에도 불구하고 이것은 상태 업데이트로 이어질 것입니다.
추가 사항 :
- 심층 비교를 수행하는 것은 상태 개체가 깊이 중첩 된 경우 성능에 상당한 영향을 미치므로 무의미합니다. 그러나 너무 중첩되지 않았고 여전히 깊은 비교가 필요한 경우 shouldComponentUpdate에서 구현하고 충분한 지 확인하십시오.
- 상태 객체를 직접 변경할 수는 있지만 반응하는 setState 메서드 흐름에서 구성 요소 업데이트주기 후크를 구현하기 때문에 구성 요소의 상태는 영향을받지 않습니다. 구성 요소 수명주기 후크를 의도적으로 피하기 위해 상태 개체를 직접 업데이트하는 경우 상태 개체가 아닌 데이터를 저장하는 데 간단한 변수 또는 개체를 사용해야 할 것입니다.