在过去的几天里,我一直在学习 React,查看了一些关于编写不同元素的不同方式的教程和解释。然而,有一个我一直很好奇 - setState
更新/覆盖组件的 state
属性的函数。
例如,假设我有一个包含以下内容的类:
class Photos extends React.Component {
constructor() {
super()
state = {
pictures: []
}
}
componentDidMount() {
// This is where the fetch and setState will occur (see below)
}
render() {
return {
<div className="container">
{this.state.pictures}
</div>
}
}
}
这个例子让我从 API 获取图像。
鉴于我已经执行了此函数的提取、映射和返回 - 然后我将使用 API 调用中获得的结果更新 pictures: []
状态数组。
我的问题源于我所看到的关于如何更新/覆盖图片状态属性的不同方法。
我看到它以两种不同的方式写成:
1) 这似乎是一个非常简单易读的方法
this.setState({pictures: pics})
2) 这更复杂,但我看到它被描述为更安全的方法
this.setState(prevState => ({
pictures: prevState.pictures.concat(pics)
}))
有人可以解释一下使用其中任何一个的优点吗?我想在未来与代码保持一致,处理道具和状态等,所以最通用的方法当然是首选。
原文由 physicsboy 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,在您的情况下,这两种语法完全不同,您可能要寻找的是两者之间的区别
和
要理解为什么第二种方法是首选方法,您需要了解 React 在内部使用
setState()
做什么。React 将首先将您传递给
setState()
的对象合并到当前状态。然后它将开始那个和解的事情。由于调用setState()
可能不会立即更新您的状态。React 可以将多个
setState()
调用成一个更新以获得更好的性能。考虑简单的情况,为了理解这一点,在您的函数中您可能会多次调用
setState()
,例如:这在一个简单的应用程序中不是一个有效的用例,但随着应用程序变得复杂,多个
setState()
调用可能从多个地方发生,做同样的事情。所以现在要执行高效更新,React 通过提取传递给每个
setState()
调用的所有对象来执行批处理操作,将它们合并在一起形成一个对象,然后使用该对象执行setState()
。根据setState()
文档:因此,如果任何对象包含相同的键,则存储具有相同键的最后一个对象的键值。因此更新只对最后一个值发生一次。
演示代码沙盒