Означает ли это, что он считается «доступным только для чтения»?
Например, если состояние:
{
arr: arrData,
obj: objData,
aMap: mapData,
aSet: setData
}
Для любого из четырех элементов, в которых нет изменений , мы можем оставить все как есть, но, скажем, на 3 уровня ниже obj
, что составляет obj.b.c.d
, и это d
относится к массиву, и нам нужно изменить одну запись в массиве, тогда нам нужно сделать копию этого массива, изменить запись и позволить новому состоянию ссылаться на него? Но если 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
, если мы должны были выгрузить все значения остались прежними, в то время как новое состояние вывело бы значения для нашего нового состояния.