这是否意味着将其视为“只读”?
例如,如果状态是:
{
arr: arrData,
obj: objData,
aMap: mapData,
aSet: setData
}
对于这四个中的任何一个没有变化的,我们可以保持原样,但是我们说 3 level down obj
,即obj.b.c.d
,并且 thisd
指的是一个数组,我们需要修改数组中的一个条目,那么我们需要制作该数组的副本,修改条目,并让新状态引用它?但是如果d
指的是一个新数组,那么就c
需要一个新的d
,所以c
需要一个新的对象,出于同样的原因,我们需要一个新的b
,最终,一个新的obj
?
所以它是
let objNew = {
...obj,
b: {
...obj.b,
c: {
...obj.b.c,
d: [...obj.b.c.d]
}
}
};
objNew.b.c.d[someIndex] = someNewValueOrObj;
现在objNew
可以返回,并且没有以任何方式修改旧状态(仅读取它)。
因此,如果prevState
是旧状态,并且state
是新状态,我们只需要在返回新状态之前确保正确,因为prevState
,如果我们要转储所有值,它与传入的值保持一致,而新状态将转储我们新状态的值。