Redux:这是否算作变异状态?

时间:2016-11-22 22:44:00

标签: javascript angular redux

在Angular2(NgRedux)中使用Redux更新/设置订单条目。是否可以改变代理变量,然后对象。将其指定为状态?

在我的数据缩减器中:

case DataActions.UPDATE_ORDER:
  var updatedItem
  var updatedState = state.orders
  for(var i = 0; i < state.orders.length; ++i) {
    if(state.orders[i]['key'] === action.payload.key) {
      updatedItem = state.orders[i]
      updatedItem.name = action.payload.name
      updatedItem.items = action.payload.items
    }
  }
  updatedState[i] = updatedItem
  return Object.assign({}, state, {
    orders: updatedState
  })

2 个答案:

答案 0 :(得分:3)

你的“代理变量”只是对同一个对象的另一个引用,所以是的,你 直接改变了那个数组中的项目。

为了正确执行不可变更新,应复制每个嵌套级别。 Redux文档提供了常见错误的示例,以及如何在http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html中正确执行此操作。

答案 1 :(得分:0)

非常感谢@markerikson的解决方案。

我选择了文档的建议并使用了dotProp库。这很有效:

npm install dot-prop-immutable
...
var dotProp = require('dot-prop-immutable');
...
case DataActions.UPDATE_ORDER:
  for(var i = 0; i < state.orders.length; ++i) {
    if(state.orders[i]['key'] === action.payload.key) {
      state = dotProp.set(state, `orders.${i}.name`, action.payload.name)
      state = dotProp.set(state, `orders.${i}.items`, action.payload.items)
    }
  }
  return state