React代码在某种程度上是向后执行的.我都快疯了
React code is somehow executing backwards. I'm about to go crazy
说真的,这就像Javascript的双缝实验。
基本上我有一系列的步骤。我想要发生的是,当用户向列表添加新步骤时,activeStepId
的状态被设置为新添加的步骤(它在步骤列表中突出显示)。
如下所示,我正在监听存储中的变化,并触发组件中的onChange事件。
现在,这是最疯狂的部分:
每当我比较newState.steps.length > this.state.steps.length
以查看新状态是否比以前的状态有更多的步骤时,不知何故,旧状态已经被更新为新状态,尽管setState甚至还没有被调用!
现在,我知道你可能在想,在我的代码的其他地方,我更新状态没有意识到它。是的,我也这么认为,但是当我删除对下面setState的调用然后检查结果时,它工作了!this.state.steps.length
是它本来应该是的:旧的值,而不是新的值。
我已经花了几个小时在这上面了,但我真的不知道发生了什么。
componentDidMount: function(){
FlowStepStore.on('change', this.onChange);
},
onChange: function(){
var newState = this.getState();
// If we've just added a step, set it as active
if(newState.steps.length > this.state.steps.length){
newState.activeStepId = newState.steps[newState.steps.length - 1].id;
}
this.setState(newState);
},
getState: function(){
return {
activeStepId: this.activeStepId(),
steps: FlowStepStore.getSteps()
};
},
我也试过用不同的方式,通过使用componentDidUpdate(prevProps, prevState)和比较prevState来执行步数比较。但我也遇到了同样的问题!不知何故,prevState已经等于当前状态。
吹。
帮助!
@Heap的评论是正确的。我没有意识到我的状态对存储中的变量有直接引用(JS通过引用传递,而不是通过值传递),该变量在设置组件状态之前得到更新。修改我的存储以返回_steps.slice()而不是仅仅返回_steps,现在它工作了!
相关文章:
- ajax加载了内容,脚本没有执行
- Nightwatch:有没有办法查明executeSync是否执行了javascript
- React.js中显示了模态时如何执行某些操作
- jQuery:一旦加载了图像的子集,就执行函数
- WebView加载URL(“javascript:XYZ”)在我的网络视图中执行了好几次
- 为什么这个函数执行了两次
- 等待JQuery执行,直到加载了整个页面,中断执行
- 仅限Chrome:ajax冻结了我的JavaScript执行
- 节点可执行文件中返回了错误的pid
- Chained Promise给出了未定义的函数错误,但我可以单独执行这些函数
- 拒绝执行内联事件处理程序,因为它违反了CSP.(沙盒)
- 打开文件时停止了JS执行
- 即使应用了 TabIndex,也不会使用键盘执行 onClick
- Android的PhoneGap加速度计应用程序像疯了一样滞后,什么'我的代码错了
- jquery如果按钮点击了执行其他操作执行其他操作
- Javascript滑块在一段时间后像疯了一样滑动
- webkitTransform在safari中的bug ?我疯了吗?
- React代码在某种程度上是向后执行的.我都快疯了
- 在调用FB.init()之前调用FB.getLoginStatus().疯了
- 这是HTML5中的一个错误还是我疯了