【问题标题】:Update State's property from axios response, if difference between them从 axios 响应中更新 State 的属性,如果它们之间存在差异
【发布时间】:2019-02-08 12:17:09
【问题描述】:

我想找到一种方法将来自 axios 的即将响应的响应与当前状态的属性进行比较,并且只有当它们不同时,才使用带有响应的 setState 来替换该属性。否则跳过setState的使用,因为它们是相等的

componentWillReceiveProps(nextProps: Readonly<Props>, nextState: Readonly<State>): boolean {

        if (nextProps.isReloading !== this.state.isReloading) {
            // HERE we just confirm to proceed and change this prop
            this.setState({
                isReloading: nextProps.isReloading,
            });
            getData('/some-end-point')
                    .then((response: any) => { 
                      const newItems = response.data;

已经记录并确认它们相等,但下一行返回 NO

                     this.state.items == newItems ? 'YES' : 'NO';

然后,只有在不同的情况下,才用新的状态更新当前状态

                    })
                    .catch((error: any) => {
                        console.log(error);
                    });
            return true;
        }

        return false;
    }

【问题讨论】:

    标签: reactjs typescript axios setstate


    【解决方案1】:

    我的假设是newItems 是一个数组,

    仅仅将它们与===== 进行比较是行不通的(各种原因不会涉及)

    如果 this.state.items 相同,不替换有什么好处吗?

    如果重要到你不调用setState如果它们相同,你可以通过循环数组并比较数组的每个元素来比较它们

    newItems.length === this.state.items.length && newItems.sort().every((value, index)=> value === this.state.items.sort()[index]);
    

    这是假设数组中的每个元素都是stringnumber,如果任何元素是另一个数组或对象,则必须在每个元素中进行类似的比较

    我假设你可以使用 lodash isEqual 来做到这一点

    【讨论】:

    • 与 === 比较不像你说的那样工作,我忘了提到这一点。两个数组都填充了具有很多不同键的对象,所以我想找到一个更好的解决方案,如果可能的话,而不是每次都比较每个元素。需要跳过设置状态,因为现在需要在客户端完成很多刷新。我会检查 lodash
    • 是的,我完全理解你。尝试 lodash 或任何具有 deep-equal 的库(这就是您要搜索的比较类型)
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2023-01-26
    • 2014-05-17
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多