неглибоке порівняння - це те, коли властивості об'єктів, що порівнюються, виконуються за допомогою "===" або суворої рівності і не проводять порівняння глибше в властивостях. наприклад,
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
. Щоб 2 об’єкти були однаковими, вони повинні вказувати на один і той же об’єкт. Таким чином, це призводить до оновлення стану, що оцінюється
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
Цього разу кожне із властивостей повертає істину для суворого порівняння, оскільки властивість команд у новому та старому об’єкті вказує на той самий об’єкт.
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, який реагує, реалізує гачки циклу оновлення компонентів. Якщо ви оновлюєте об'єкт стану безпосередньо, щоб навмисно уникати переключень життєвого циклу компонента, то, ймовірно, ви повинні використовувати просту змінну або об'єкт для зберігання даних, а не об'єкт стану.