So sánh nông là khi các thuộc tính của đối tượng được so sánh được thực hiện bằng cách sử dụng "===" hoặc bình đẳng nghiêm ngặt và sẽ không tiến hành so sánh sâu hơn vào các thuộc tính. ví dụ
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);
Mặc dù cả hai đối tượng có vẻ giống nhau, nhưng game_item.teams
không phải là tham chiếu giống nhau updated_game_item.teams
. Để 2 đối tượng giống nhau, chúng nên chỉ vào cùng một đối tượng. Do đó, điều này dẫn đến trạng thái được đánh giá là cập nhật
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
Lần này mọi thuộc tính trả về true cho phép so sánh chặt chẽ vì thuộc tính nhóm trong đối tượng mới và cũ trỏ đến cùng một đối tượng.
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item);
Các updated_game_item3.first_world_cup
bất động sản không đánh giá nghiêm ngặt như 1930 là một con số trong khi game_item.first_world_cup
là một chuỗi. Nếu sự so sánh bị lỏng lẻo (==) thì điều này sẽ trôi qua. Tuy nhiên, điều này cũng sẽ dẫn đến cập nhật trạng thái.
Ghi chú bổ sung:
- Thực hiện so sánh sâu là vô nghĩa vì nó sẽ ảnh hưởng đáng kể đến hiệu suất nếu đối tượng trạng thái được lồng sâu vào nhau. Nhưng nếu nó không quá lồng nhau và bạn vẫn cần so sánh sâu, hãy triển khai nó trong shouldComponentUpdate và kiểm tra xem điều đó có đủ hay không.
- Bạn chắc chắn có thể thay đổi đối tượng trạng thái trực tiếp nhưng trạng thái của các thành phần sẽ không bị ảnh hưởng, vì nó trong luồng phương thức setState mà phản ứng thực hiện các móc chu kỳ cập nhật thành phần. Nếu bạn cập nhật trực tiếp đối tượng trạng thái để cố tình tránh các móc vòng đời của thành phần, thì có lẽ bạn nên sử dụng một biến hoặc đối tượng đơn giản để lưu trữ dữ liệu chứ không phải đối tượng trạng thái.