поверхностное сравнение - это когда свойства сравниваемых объектов выполняются с использованием «===» или строгого равенства и не будут проводить более глубокое сравнение свойств. например, для
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 для строгого сравнения, поскольку свойство team в новом и старом объекте указывает на один и тот же объект.
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, который реагирует, реализует перехватчики цикла обновления компонентов. Если вы обновляете объект состояния напрямую, чтобы сознательно избегать перехватов жизненного цикла компонента, то, вероятно, вам следует использовать простую переменную или объект для хранения данных, а не объект состояния.