修改状态和更新减速器的正确方法? (反应/还原)

Posted

技术标签:

【中文标题】修改状态和更新减速器的正确方法? (反应/还原)【英文标题】:Modifying state & the correct way to update my reducer? (React / Redux) 【发布时间】:2017-11-10 05:39:03 【问题描述】:

我相信我已经修改我的状态已经有一段时间了。我想做以下事情,想知道为什么它不起作用:

case "SAVE_DATA_TO_PERSON" :
        let newState = ...state, data: start: action.payload.start, end: action.payload.end;  
        return newState;

我在这里创建一个新对象,采用旧状态,并添加我的新数据。 虽然它似乎确实有所作为,但它不会长时间保留数据。在触发其他动作后,它就消失了。我想知道为什么?

这是我以前的做法,而且似乎有效:

case "SAVE_DATA_TO_PERSON" :
        let newState = state;
        newState.audio = start: action.payload.start, end: action.payload.end;

        return newState;

但是在这里,我似乎正在修改状态。

我只想知道我的第一个解决方案是不是正确的,我这里的第二个解决方案确实是修改状态。

【问题讨论】:

当然第二种方案是直接修改状态——怎么会呢? 我想我认为我已经将状态复制到 newState(作为新对象)中,并且没有使用引用。 不,它们指的是同一个状态对象。 【参考方案1】:

在第二个选项中,您直接修改状态。

reducer 应该在 React-Redux 应用程序中改变状态而不改变现有状态。

不变性是 Redux 的要求,因为 Redux 代表您的 应用程序状态为“冻结的对象快照”。有了这些离散 快照,您可以保存您的状态,或反转状态,通常 对所有状态变化有更多的“核算”。 Ref.

您云考虑使用不可变实用程序/库作为dot-prop-immutable 或Immutable.js

redux 文档中的相关文章:

http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html

【讨论】:

以上是关于修改状态和更新减速器的正确方法? (反应/还原)的主要内容,如果未能解决你的问题,请参考以下文章

从 redux 更改状态后如何以及何时调用反应组件方法

反应+还原。 Connect 不更新组件的状态

反应状态没有在 SetInterval 方法中正确更新

如何正确更新反应钩子状态中的数组

更新 Redux 存储时反应组件不重新渲染

如何正确更新处于反应状态的对象或数组[重复]