0

这是否意味着将其视为“只读”?

例如,如果状态是:

{
  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,如果我们要转储所有值,它与传入的值保持一致,而新状态将转储我们新状态的值。

4

1 回答 1

0

Redux 使用浅相等来检查状态是否已更改以触发 React 中的渲染。如果对新状态的引用和之前的引用相同,即===返回 true,Redux 认为没有任何变化,并简单地从 reducer 返回。

无论值在您的状态中发生了多么深的变化,您都必须生成一个与旧值在引用上不同的新状态值。

我建议您考虑使用像immer这样的库来有效地帮助您。

于 2020-02-12T04:20:43.870 回答