La comparación superficial es cuando las propiedades de los objetos que se comparan se realizan utilizando "===" o igualdad estricta y no realizarán comparaciones más profundas en las propiedades. por ejemplo
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);
Aunque ambos objetos parecen ser iguales, game_item.teams
no es la misma referencia que updated_game_item.teams
. Para que dos objetos sean iguales, deben apuntar al mismo objeto. Por lo tanto, esto da como resultado que el estado se evalúe para actualizarse
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
Esta vez, cada una de las propiedades devuelve verdadero para la comparación estricta, ya que la propiedad de teams en el objeto nuevo y antiguo apunta al mismo objeto.
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item);
La updated_game_item3.first_world_cup
propiedad no pasa la evaluación estricta ya que 1930 es un número mientras que game_item.first_world_cup
es una cadena. Si la comparación hubiera sido floja (==), esto habría pasado. No obstante, esto también resultará en una actualización del estado.
Notas adicionales:
- Hacer una comparación profunda no tiene sentido, ya que afectaría significativamente el rendimiento si el objeto de estado está profundamente anidado. Pero si no está demasiado anidado y aún necesita una comparación profunda, impleméntelo en shouldComponentUpdate y verifique si eso es suficiente.
- Definitivamente puede mutar el objeto de estado directamente, pero el estado de los componentes no se vería afectado, ya que está en el flujo del método setState que reacciona implementa los ganchos del ciclo de actualización del componente. Si actualiza el objeto de estado directamente para evitar deliberadamente los ganchos del ciclo de vida del componente, probablemente debería usar una variable u objeto simple para almacenar los datos y no el objeto de estado.