Что именно означает, когда мы говорим, что не можем изменить объект состояния в 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, чтобы помочь вам в этом более эффективно.

Другие вопросы по тегам