javascript - 为什么 redux 每次更改时都需要复制数据?

标签 javascript reactjs copy redux react-redux

据我所知,redux 使用 Object.assign 或扩展运算符来制作数据的浅拷贝,但这有什么意义呢?我认为它的全部意义在于对发送的数据进行深度复制,这样如果数据在商店外发生更改,它也不会更改商店中的内容。如果它是一个浅拷贝,那么数据将被链接,这会导致数据在没有调度的情况下改变商店中的内容,对吗?

在下面的示例中,如果 action.data 仅被浅层复制,那么如果该数据从它来自的任何地方被更改,它会更改存储中的内容,即使没有正确的调度?

const activePokemon = (state = {}, action) => {
  switch (action.type) {
    case 'ADD_ACTIVE_POKEMON':
      return {
        ...state,
        ...action.data
      }
    default:
      return state
  }
}

最佳答案

如果您正在关注 Three Principlesredux ,那么您就不用担心店外的变化了。

The only way to change the state is to emit an action, an object describing what happened.

如果store外的改动是为了修改状态,dispatch应该改用。除了更新状态,dispatch还会将更改通知商店的每个订阅者。

一旦您将一些数据“链接”到状态,数据就不应更改,因为它是状态的一部分,并且..

State is read-only

编辑:关于复制

reducers 的文档中(再读一遍了解详情!),redux只需要我们的 reducer 保持pure 。如果新的状态不同,reducer 必须创建新的对象,复制是描述未改变部分的一种方式。

我们并不总是制作副本来描述新状态。 return {}可用于清除所有状态属性,当只有少数属性需要保留时,我们可以指定不变的属性而不是复制:

return {
  unchangedProp0: state.unchangedProp0,
  unchangedProp1: state.unchangedProp1,
  ...newData
}

关于javascript - 为什么 redux 每次更改时都需要复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521868/

相关文章:

c++ - 为什么我的回推功能不起作用,只是出现段错误

c++ - For 循环与赋值运算符

javascript - jquery grid 第二次加载时不工作

reactjs - React Router 和 Express 冲突

javascript - optgroup 标签在 Chrome 浏览器中不是粗体

javascript - 如何在useEffect hook中使用Promise.all获取所有数据?

Javascript 点击特定于 ID

javascript - 在 vue.js 中获取当前时间和日期

javascript - 用于 Internet Explorer 的 javaScript 中的 innerHTML

c++ - 由于复制,记录器记录 2 次而不是一次