【发布时间】:2016-05-09 19:50:47
【问题描述】:
在我的 react/redux 项目中,我有一个对数组进行排序的操作:
case 'SORT_BY_NAME':
var newList = state.list; //.slice()
newList.sort(function(a,b){
if (a.name > b.name){
return 1;
} else if (a.name < b.name){
return -1;
} else {
return 0;
}
});
return Object.assign({}, state, { list: newList } );
初始渲染很好。但是排序操作未能导致我的组件的渲染方法再次被调用,因此 UI 中的数据从未出现排序。
我的项目的架构类似于 Redux 文档中的 Reddit example。但是,我也使用 react-redux 与 mapStateToProps 的连接。下面是我的组件设计的精简版:
class MyComponent extends React.Component{
render(){
<ul>
{list.map(item =>
<li key={item.id}>
{item.name}
</li>
)}
</ul>
}
}
function mapStateToProps(state){
return {
list: state.list;
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(MyComponent)
通过在 mapStateToProps 中设置断点,看起来状态正在被正确设置/更改;根据 Chrome 调试器中的 Redux devtools,商店看起来和我想的一样。
我的项目太大,无法创建一个完全重现我的问题的演示小提琴。当我尝试创建一个最小尺寸的小提琴来重现该问题时,我更加困惑,因为当我不使用 Redux 的连接时问题不会发生。 Link to fiddle.
总而言之,我的问题是为什么在使用 mapStateToProps 时排序没有生效。我最好的猜测是,如果我的排序操作改变了先前的状态,以便新状态与先前的状态匹配,那么就没有需要重新渲染的差异。也许 mapStateToProps 比较了以前的状态和新的状态,它不会将新的道具与道具在 DOM 中的表示进行比较。
【问题讨论】:
-
您的假设是正确的,并在此处文档的第一段中得到确认:redux.js.org/docs/Troubleshooting.html
标签: reactjs redux react-redux