【发布时间】:2015-08-01 01:05:51
【问题描述】:
我有这样的组件结构
<A>
<B>
<C/>
<C/>
</B>
<D>
<E/>
<E/>
</D>
</A>
想法是块 E 中组件上的操作由组件 A 的函数处理为 A 的状态,然后作为道具传递给 B 和 C。我知道,更好的方法是使用 Flux、pubsub-js 或其他 Store-message 系统,但希望有人能解释为什么按照我的理解正确的解决方案不起作用。
从组件 E 的多个实例中同时调用组件 A 的此函数会导致竞争条件只有一个状态更改(而不是每个函数调用都提供更改)
updateState(value,index){
this.setState(update(this.state, {
a: {
[index]: {
b: {
$set: value
}
}
}
})
);
}
这里的函数更新来自
import update from 'react/lib/update';
不符合 ReactJS 推荐做法的错误解决方案,但效果很好:
updateState(value,index){
this.state.a[index].b=value;
this.forceUpdate();
);
}
我的问题是:
这是一个错误,多个同时 setState 调用了一个竞争条件,还是我在不理解的情况下做错了什么?
【问题讨论】:
-
setState 是异步的,并且尽可能由 React 批处理以提高性能
标签: reactjs race-condition setstate