Что именно означает, когда мы говорим, что не можем изменить объект состояния в Redux-редукторе?
Означает ли это, что он должен работать как "только для чтения"?
Например, если состояние:
{
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
, если бы мы выгрузили все значения, они остались бы такими же, как и были переданы, в то время как новое состояние выгрузило бы значения для нашего нового состояния.
1 ответ
Redux использует поверхностное равенство, чтобы проверить, изменилось ли состояние для запуска рендеринга в React. Если ссылки на новое состояние и предыдущее одинаковы, т.е.===
возвращает истину, Redux считает, что ничего не изменилось, и просто возвращается из редуктора.
Вам нужно будет создать новое значение состояния, которое будет ссылочно отличаться от старого, независимо от того, насколько глубоко в вашем состоянии значение изменилось.
Я бы посоветовал вам подумать об использовании библиотеки, такой как immer, чтобы помочь вам в этом более эффективно.