javascript - this.setState 不会更新用户对象中的嵌套数组,但是当 console.loging 相同的逻辑时,它返回一个看起来正确的对象

标签 javascript reactjs

因此,用户可以选择一堆餐食。我在用户对象内有一个对象数组来存储食物。

用户选择一些餐食并单击提交后,我使用 setState 尝试更新用户餐食,我是这样做的。

submitAllMeals(arrayOfMeals) {
    this.setState({
        user: {
            ...this.state.user,
            meals: [...this.state.user.meals, ...arrayOfMeals]
        }
    });

    console.log({
        user: {
            ...this.state.user,
            meals: [...this.state.user.meals, ...arrayOfMeals]
        }
    });

    axios
        .put('http://localhost:5000/getuserdata', {
            userdata: this.state.user
        })
        .then(response => {
            console.log(response);
        });
}

奇怪的是,餐食并没有添加到状态下的用户对象中,但是下面的控制台日志记录了正确的输出。

即使创建新对象的逻辑是正确的,我的状态没有更新是否有原因?如果是这样,有人知道为什么吗?

最佳答案

<小时/>

React 的 setState 是异步的,这意味着 this.state 可能会在您使用组件的内部状态后更新。您必须将其视为请求 - 它不会立即发生。

在您发出 axios 请求时,您仍然无法确定是否拥有 this.state.user

要解决这个问题,您可以使用回调。 setState 的第二个参数接收回调,因此您可以执行使用更新状态的 axios 请求,例如:

this.setState({
    user: {}
}, () => {
    // your request that uses the updated this.state.user
});

setState() 文档:https://reactjs.org/docs/react-component.html#setstate

关于javascript - this.setState 不会更新用户对象中的嵌套数组,但是当 console.loging 相同的逻辑时,它返回一个看起来正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51797224/

相关文章:

javascript - 使侧边栏可用于所有组件 | react JS | react 路由器 v6

javascript - 动态加载 React 组件

javascript - 将 JavaScript 变量传递给外部 CSS 文件

javascript - 挤压网页以显示广告

javascript - d3js 力导向箭头不会出现在路径末尾

javascript - 如果像 <br> 这样的自关闭标签没有关闭,JSX 中是否有一个 API 可以忽略?

javascript - 为什么当我使用 .map 而不是硬编码来动态填充内容时,Material UI 选项卡停止工作?

javascript - 信息窗口中的 Rateit 或 Raty(Google map )

javascript - 使用具有功能组件的 Prop 更新组件的状态

javascript - 如何避免 "React Hook useEffect has a missing dependency"和无限循环