Redux反应不可变的setIn元素更改整个列表

时间:2017-04-03 08:07:26

标签: reactjs redux immutable.js

我在redux中有这个reducer:

let index = state.items.findIndex(item => item.get('_id') == action.id);
let list = state.items.setIn([index, "selected"], action.selected)

return {
    ...state,
    items: list
}

在这种情况下,当我看到redux更改时,我看到整个列表已更改,然后我的所有视图都是reders而不是特定项。

我做错了什么?

更新: 我更改为updateIn,现在我的状态显示只更新了一个元素,但我的整个应用程序仍然是渲染而不是特定元素:

<Row style={styles.row} key={item.get('_id')} item={item} selected={item.get('selected')}
                        onSelect={this.props.onRowSelect}/>

1 个答案:

答案 0 :(得分:0)

看起来你没有使用减速剂成分。我强烈建议,因为它使每个reducer更容易理解:http://redux.js.org/docs/api/combineReducers.html

如果没有看到你的组件如何映射到状态,很难分辨出这里发生了什么,但我相信你问题的根源在于你从reducer返回的东西将永远是一个新对象。

  • 返回状态将是一个新对象,因为您已将旧state与新列表合并。
  • 项目将是一个新对象,作为immutablejs所做的一部分,确保如果你改变其中的一个孩子,那个改变会向上级联,触及所有父母。
  • 最后,您更新的各个项目将成为新对象。

我怀疑您需要更改selectormapStateToProps功能以阻止其获取items,因为它始终会更改,因此始终会导致重新呈现。