Arrays React-Redux:即使mapStateToProps已更新,视图也未更新 我的应用程序和存储
通过使用ReactJS的Redux,我在存储中保留了一个对象数组(称为结果),并分派对其进行排序和操作的操作。在MapStateTops中,我返回这个结果数组,它在视图的列表中呈现结果Arrays React-Redux:即使mapStateToProps已更新,视图也未更新 我的应用程序和存储,arrays,reactjs,sorting,redux,react-redux,Arrays,Reactjs,Sorting,Redux,React Redux,通过使用ReactJS的Redux,我在存储中保留了一个对象数组(称为结果),并分派对其进行排序和操作的操作。在MapStateTops中,我返回这个结果数组,它在视图的列表中呈现结果 // in Component file export default class ResultList extends Component { constructor(props) { super(props); this.renderResults = this.ren
// in Component file
export default class ResultList extends Component {
constructor(props) {
super(props);
this.renderResults = this.renderResults.bind(this);
}
renderResults(results) {
return (
results.map((result) => {
return <AnotherComponent />
})
);
}
render() {
const { results } = this.props;
return (
<div>
<ul>
{this.renderResults(results)}
</ul>
</div>
)
// in Container Component file
const mapStateToProps = (state, ownProps) => {
console.log('map state is triggered');
return {
results: state.results
};
}
//在组件文件中
导出默认类ResultList扩展组件{
建造师(道具){
超级(道具);
this.renderResults=this.renderResults.bind(this);
}
渲染结果(结果){
返回(
results.map((结果)=>{
返回
任何帮助都将不胜感激。谢谢
更新
我很抱歉,但必须纠正我上面的说法,即在存储区中的结果第一次更新后,视图没有进一步更新。经过进一步测试,我发现这不完全正确。仅当结果数组根据下面排序函数的情况1排序时,视图才会更新。Cases 2和ses 3不会导致视图更新。这可能是/可能不是必要的信息,但结果数组会在一个循环中按以下顺序按这3个案例进行排序:案例1、案例3、案例2
// in reducer index.js file
case SORT_RESULTS:
return {
...state,
results: sortArr(state.results, state.sortType)
};
// sorting function
function sortArr(arr, sortType) {
let newArr = [];
switch (sortType) {
case '1':
for (let i = arr.length - 1; i >= 0; i--) {
newArr.push(arr[i]);
}
return newArr;
case '2':
newArr = arr;
newArr.sort((a, b) => {
return b.num - a.num;
});
return newArr;
case '3':
newArr = arr;
newArr.sort((a, b) => {
let id1 = a.id.toLowerCase();
let id2 = b.id.toLowerCase();
if (id1 < id2) {
return -1;
}
if (id1 > id2) {
return 1;
}
return 0;
});
return newArr;
default:
return arr;
}
}
//在reducer index.js文件中
案例排序结果:
返回{
……国家,
结果:sortArr(state.results,state.sortType)
};
//排序功能
函数sortArr(arr,sortType){
设newArr=[];
开关(sortType){
案例“1”:
for(设i=arr.length-1;i>=0;i--){
新推力(arr[i]);
}
返回newArr;
案例“2”:
newArr=arr;
新数组排序((a,b)=>{
返回b.num-a.num;
});
返回newArr;
案例“3”:
newArr=arr;
新数组排序((a,b)=>{
设id1=a.id.toLowerCase();
设id2=b.id.toLowerCase();
如果(id1id2){
返回1;
}
返回0;
});
返回newArr;
违约:
返回arr;
}
}
解决方案
罪魁祸首是:newArr=arr
。将其更改为newArr=arr.slice()
,视图将在每次排序时更新
可能的根本原因
至于这个解决方案为什么有效,我邀请其他人的观点。以下是我的想法:
根据:
“slice()方法将数组部分的浅层副本返回到从开始到结束(不包括结束)选择的新数组对象中。”
使用<代码> NeWrr= ARR < /COD>复制结果数组似乎只复制指针(到数组),这实际上只是内存中的一个引用。如果这个语句是真的,那么ReDux就不会认为状态完全改变了,因为它正在比较完全相同的指针(状态。结果)。,即使通过排序确认数组本身的实际数据发生了更改。通过
slice()复制一个全新的数组
将涉及一个新指针和数据,这将被检测为对引擎盖下Redux的更改。您是否尝试在MapStateTrops
中记录状态。结果
?是的,我使用Redux logger中的createLogger()记录每次调度的状态。结果数组将得到正确的操作/更新。正在执行console.logMapStateTops中的(state.results)会产生相同的结果。您是否可以注销ComponentWillReceiveProps(nextProps){console.log(nextProps.results)
然后查看道具是否在那里更新?componentWillReceiveProps也只在结果存储的第一次更新时运行我已经用澄清信息更新了帖子。我确信问题更多地在于我排序结果数组的方式或返回新状态的方式。我完全有同样的问题真让我抓狂。谢谢你的发帖!是的,一样。现在使用lodash\uz.cloneDeep没有任何问题。我让一个spread操作符解决了同样的问题。这感觉很难看,效率很低,但它确实有效。