javascript - React - 功能 setState(先前状态)与新更新值不同?

标签 javascript reactjs asynchronous state

我目前正在尝试通过最近的多个类(class)学习 React

要更新状态,大多数类(class)建议采用这种方式:

 const updatedNinjas = [...this.state.ninjas, newNinja];

    this.setState({
      ninjas: updatedNinjas
    });

但是,由于setState是“异步的”,官方react documentation建议使用之前的状态,并在此基础上进行更新。

this.setState(prevState => ({
      ninjas: [...prevState.ninjas, newNinja]
    }));

两者都在解决同一个问题(因为我们在第一个示例中每次都使用一个新数组)还是只是最后一个是万无一失的?

最佳答案

如果你的新状态是根据任何已经存在的值计算出来的——那么你应该在你使用函数的地方使用第二种形式的setState:

this.setState(prevState => ({
  ninjas: [...prevState.ninjas, newNinja]
}));

甚至:

this.setState(({ninjas}) => ({
  ninjas: [...ninjas, newNinja]
}));

这是因为状态更改是异步的,并且由于性能原因可以批处理。

如果您使用一些基于状态的任何值的变量更改状态 - 您可以自由使用简单版本:

this.setState({
  answer: 42
});

关于你的

since we use a new array each time in the first example

实际上,您每次都创建了一个新数组,但是您创建它时使用了一些项目集,到那时实际状态更改将由 React 在幕后执行时可能不相关。

关于javascript - React - 功能 setState(先前状态)与新更新值不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203864/

相关文章:

javascript - jQuery 延迟 : use to delay return of function until async call within function complete + get return value

javascript - 对自定义验证器的范围更改触发验证

javascript - react 无限幻灯片

javascript - Node.js 什么时候开始提供 ES6 类的?

javascript - 如何在 React Native 中绘制图表?

python - 如何在 python 中同时执行批量请求?

asp.net - 在asp.net中实时显示命令行程序的输出

c# - 动态设置 Iframe 的 Src 属性,同时保持跨浏览器兼容性

javascript - 如何从 React 中的另一个函数为 componentDidMount 设置值?

javascript - react 悬停在按钮上会导致另一个按钮悬停在上面