React代码在某种程度上是向后执行的.我都快疯了

React code is somehow executing backwards. I'm about to go crazy

本文关键字:疯了 执行 代码 在某种程度上 React      更新时间:2023-09-26

说真的,这就像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,现在它工作了!