Что именно это означает, когда мы говорим, что не можем изменить объект состояния в редукторе Redux? - PullRequest
0 голосов
/ 12 февраля 2020

Означает ли это, что он считается «доступным только для чтения»?

Например, если состояние:

{
  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 Ответ

0 голосов
/ 12 февраля 2020

Redux использует поверхностное равенство, чтобы проверить, изменилось ли состояние для запуска рендера в React. Если ссылается на новое состояние и предыдущее совпадают, то есть === возвращает true, Redux считает, что ничего не изменилось, и просто возвращается из редуктора.

Вам придется произвести новое значение состояния, которое относительно отличается от старого независимо от того, как глубоко в вашем состоянии значение изменилось.

Я бы посоветовал вам использовать библиотеку типа immer , чтобы помочь вам с этим эффективным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...