这两个状态更新在反应之间有什么区别?

加布里埃尔·奥利维拉(Gabriel Oliveira)

我正在学习React课程,当时讲师正在解释有关更新状态的信息,但我无法理解这两个片段在内部的真正区别,请参见下面的代码笔链接:

直接更新状态代码段

class Counters extends Component {
  state = {
    counters: [
      { id: 1, value: 4 },
      { id: 2, value: 0 },
      { id: 3, value: 0 },
      { id: 4, value: 0 }
    ]
  };

  handleIncrement = counter => {
    const updatedCounters = [...this.state.counters];
    updatedCounters[0].value++;
  };
}

间接更新状态,然后保存代码段

class Counters extends Component {
  state = {
    counters: [
      { id: 1, value: 4 },
      { id: 2, value: 0 },
      { id: 3, value: 0 },
      { id: 4, value: 0 }
    ]
  };

  handleIncrement = counter => {
    const updatedCounters = [...this.state.counters];
    const index = updatedCounters.indexOf(counter);
    updatedCounters[index] = {...counter};
    updatedCounters[index].value++;
    this.setState({ counters: updatedCounters });
  };
}

在本讲座中,讲师解释说第一个代码片段确实会直接更新状态。所以我的问题是,如果第一个示例(如讲师所述)直接更新状态,那么阻止第二个代码段直接更新状态的唯一事情就是下面的代码行:

updatedCounters[index] = {...counter};

如果是这样,它将如何运作?

米歇尔·蒂里

在第一个示例中,updatedCounters是的副本this.state.counters,但是该副本的项目是对原始对象中完全相同的对象的引用。这可能类似于将一些书移到新盒子中。容器已更改,但内容没有更改。在第二个示例中,您不更改选定的计数器,而是先复制计数器,然后再更改该副本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

这两个循环之间有什么区别吗?

这两个正则表达式之间有什么区别?

这两个结构定义之间有什么区别?

这两个monad变压器之间有什么区别?

Caffe:这两个网络之间有什么区别?

这两个Python pandas dataframe命令之间有什么区别?

这两个代码委派示例之间有什么区别

这两个Clojure函数之间有什么区别和问题?

这两个C函数调用之间有什么区别?

这两个指针声明之间有什么区别?

这两个比较之间有什么区别?

这两个LINQ查询之间有什么区别,以及如何正确优化它们?

这两个类实例之间有什么区别?

F#中这两个函数之间有什么区别吗?

迅速地将这两个枚举声明之间有什么区别?

这两个Angular代码段之间有什么区别?

这两个javascript函数之间到底有什么区别?

就处理内存而言,这两个C函数之间有什么区别?

这两个启动项目目录之间有什么区别?

这两个代码段之间有什么区别?

关于后缀toString方法,这两个Scala代码段之间有什么区别?

Haskell Concurrent.Channel:这两个代码之间有什么区别?

这两个宏之间有什么区别吗?

这两个SQL Server连接字符串之间有什么区别

C#中这两个方法调用之间有什么区别?

PostgreSQL的这两个查询之间有什么区别?

黄瓜-这两个给定之间有什么区别?

这两个流类型别名之间有什么区别?

这两个左联接sql查询之间有什么区别?