Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Redux react不可变setIn元素更改整个列表_Reactjs_Redux_Immutable.js - Fatal编程技术网

Reactjs Redux react不可变setIn元素更改整个列表

Reactjs Redux react不可变setIn元素更改整个列表,reactjs,redux,immutable.js,Reactjs,Redux,Immutable.js,我在redux有一个减速机: 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,

我在redux有一个减速机:

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}/>

看起来您没有使用还原剂合成。我强烈鼓励这样做,因为它使每个减速器更容易理解:

如果看不到组件是如何映射到状态的,很难判断这里发生了什么,但我相信问题的根源在于,从减速器返回的总是一个新对象

  • 当您将旧的
    状态
    与新列表合并时,返回的状态将是一个新对象
  • Items将成为一个新对象,因为immutablejs所做的一部分是确保如果您更改其中的一个子对象,该更改将向上级联到所有父对象
  • 最后,您更新的单个项目将成为新对象
我怀疑您需要更改
选择器
MapStateTrops
函数,以阻止它获取
项目
,因为它总是会更改,从而总是导致重新加载