Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Arrays React-Redux:即使mapStateToProps已更新,视图也未更新 我的应用程序和存储_Arrays_Reactjs_Sorting_Redux_React Redux - Fatal编程技术网

Arrays React-Redux:即使mapStateToProps已更新,视图也未更新 我的应用程序和存储

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

通过使用ReactJS的Redux,我在存储中保留了一个对象数组(称为结果),并分派对其进行排序和操作的操作。在MapStateTops中,我返回这个结果数组,它在视图的列表中呈现结果

// 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操作符解决了同样的问题。这感觉很难看,效率很低,但它确实有效。