浅い比較とは、比較されるオブジェクトのプロパティが「===」または厳密な等価性を使用して実行され、プロパティのより深い比較が行われない場合です。例えば
// 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.
両方のオブジェクトgame_item.teams
は同じように見えますが、と同じ参照ではありませんupdated_game_item.teams
。2つのオブジェクトが同じであるためには、同じオブジェクトを指す必要があります。したがって、これにより、状態が更新されていると評価されます。
// 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.
今回は、新しいオブジェクトと古いオブジェクトのteamsプロパティが同じオブジェクトを指しているため、厳密な比較ではすべてのプロパティがtrueを返します。
// 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
updated_game_item3.first_world_cup
プロパティは、1930年と厳しい評価を失敗しながら、数あるgame_item.first_world_cup
文字列です。比較が緩やかだった場合(==)、これは成功します。それでも、これにより状態が更新されます。
その他の注意事項:
- 状態オブジェクトが深くネストされている場合、パフォーマンスに大きな影響を与えるため、ディープコンペアを実行しても意味がありません。しかし、入れ子になっておらず、さらに深い比較が必要な場合は、shouldComponentUpdateに実装して、それで十分かどうかを確認してください。
- 状態オブジェクトを直接変更することはできますが、コンポーネントの状態は影響を受けません。これは、反応するsetStateメソッドフローで、コンポーネントの更新サイクルフックが実装されるためです。状態オブジェクトを直接更新して、コンポーネントのライフサイクルフックを意図的に回避する場合は、おそらく状態オブジェクトではなく、単純な変数またはオブジェクトを使用してデータを格納する必要があります。