【发布时间】:2017-07-23 00:52:33
【问题描述】:
我目前正在构建一个 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,每次我在这里设置状态时都会递增。这种变化准确地反映在回调中,而调用列表保持不变。
我似乎无法弄清楚它为什么会这样做。实际上,我使用普通数组而不是不可变列表开始了这个项目,并遇到了同样的问题。我使用 React 已经有一段时间了,从来没有遇到过这个问题……有什么想法吗?
【问题讨论】:
-
您能否发布完整的代码示例,例如调用第二个代码块的位置?
-
我添加了更多细节——不幸的是,在这种情况下很难给出完整的代码示例,因为它是一个相当大的项目。
-
算了,我一时误会了。
-
@RyanMcClure 嗨..我根据您的示例创建了一个fiddle,它运行良好。唯一显着的区别是我使用了
handleUpdate(calls)而不是handleUpdate = ({ calls })。你能看看吗?参数中是否需要那些完美的大括号?? -
@RyanMcClure 解决了您的问题吗?
标签: javascript reactjs ecmascript-6 state immutable.js