javascript - ReactJS 状态未更新在 setState 回调中

标签 javascript reactjs ecmascript-6 state immutable.js

我目前正在构建一个 SIP 电话,其中当前调用由 SipPhone 类处理,并使用 React 显示在前端。 SipPhone 有一个调用列表,这些调用会触发 React 组件正在监听的回调。

主要电话组件的初始状态包含一个空的 Immutable List :

constructor(props) {
    super(props);
    ...
    this.state = {
        calls: List(),
    };
}

每当 SipPhone 更新时,此 calls 列表通过由回调触发的事件更新。

handleUpdate = ({ calls }) => {
    const nextCalls = List(calls.map(call => {
      return new Call({ ... }) // Call is an Immutable Record
    });

    console.log(nextCalls.toJS()); // This prints the new list I want to save
    this.setState({ calls: nextCalls }, () => {
        console.log(this.state.calls.toJS()); // The list is empty here
    });
}

有时它会成功更新 calls 列表,而有时 calls 不会改变。当我在设置状态之前记录列表时,它应该是这样,但是当登录 setState 回调时,它与之前的状态保持不变。有时有效,有时无效。

为了进一步测试这一点,我添加了一个状态变量 tick,每次我在此处设置状态时它都会递增。这种变化准确地反射(reflect)在回调中,而调用列表保持不变。

我似乎无法弄清楚为什么它会这样做。实际上,我使用普通数组而不是不可变列表开始这个项目,并遇到了同样的问题。我使用 React 已经有一段时间了,从来没有遇到过这个问题……有什么想法吗?

最佳答案

事实证明,我的代码中的另一个函数在某些情况下会在调用 componentWillUpdate 之前设置状态,导致它忽略对 setState 的初始调用。这就是错误的根源。

关于javascript - ReactJS 状态未更新在 setState 回调中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569950/

相关文章:

javascript - 如何在每次页面加载时执行内容脚本?

javascript - 商店和模型有什么区别?

javascript - 水平附加图像

javascript - 递归过滤嵌套对象

javascript - 如何解决 "Uncaught TypeError: Failed to construct ' Comment' : Please use the 'new' operat. ...."关于 React JS?

reactjs - 更改 MUI 文本字段的多个组件根

javascript - React-JS 类型错误 : Cannot read property 'setState' of undefined

javascript - 如何简化根据属性组合两个数组的 es6 函数?

javascript - 如何将函数导入到 Vue 组件?

javascript - Babel 7 没有正确转换内置子类