setState ReactJS 中的 this.state

Posted

技术标签:

【中文标题】setState ReactJS 中的 this.state【英文标题】:this.state inside setState ReactJS 【发布时间】:2019-01-19 21:59:38 【问题描述】:

所以我对 ReactJS 中 setState 的异步性质有些困惑。 根据 React 文档,您不应该在 setState() 中使用 this.state。但是,如果我有一个计数器作为状态并且我想像这样在点击时更新它:

class App extends React.Component 
    state =  counter: 0 

    onClick = () => 
        this.setState(counter: this.state.counter + 1)
    

    render() 
        return (
          <div>
            <div>this.state.counter</div>
            <p onClick=this.onClick>Click me</p>
          </div>
        )
    

这按预期工作。那么为什么这段代码是错误的呢?

更新:我知道 setState 是异步的,它接受具有先前状态作为参数的回调,但我不知道为什么我应该在这里使用它?我想引用setState里面的旧状态,那么为什么要在这种情况下使用回调函数呢?每当this.setState()被执行时,它里面的this.state总是引用旧的状态,它的值只有在setState执行完成后才会被改变为新的状态,而不是在它正在执行的时候。

【问题讨论】:

Editing this.state content before setState in React的可能重复 【参考方案1】:

您可以在 setState 调用中访问prevState

this.setState((prevState) => (
    counter: prevState.counter +1
))

这将允许您安全地增加当前状态值。

React 文档总结了为什么在更新期间不能依赖 this.state 来保持准确:https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

【讨论】:

但是this.state 里面的setState 不是已经在我的代码中引用了之前的状态吗?那么为什么在这种情况下使用 setState 回调呢? @maverick 因为 React 可以并且将会批处理 setState 调用,所以不能保证调用会在什么时候被触发。这意味着它将在可能错误的时间从this.state 读取。使用回调是从 setState 调用中访问先前状态的最安全方法。 我知道 setState 是异步的。这意味着它不会立即被调用。但是当它被调用时, this.state 仍然会引用旧状态,这就是我在这种情况下想要访问的状态。 this.state 将在 setState 完成执行后更新其值,但不会在执行时更新。 React 文档总结了为什么你不应该比我更好地依赖this.state,他们甚至有一个反例。答案已更新 请参阅官方文档中的示例:reactjs.org/docs/hooks-state.html 他们使用的地方: 所以我也像@maverick 一样糊涂了。【参考方案2】:

setState 接受一个函数作为参数,之前的状态作为参数。 重构如下以避免竞争问题:

onClick = () => 
    this.setState(prevState => (counter: prevState.counter + 1))

【讨论】:

什么补全问题?能给我举个例子吗?我知道 setState 接受回调,但我不确定为什么要在这种情况下使用它? @maverick 由于setState 是异步的,因此您不能假设this.state 是您更新的最后一个值。看看这个:***.com/a/48209870/5735030.

以上是关于setState ReactJS 中的 this.state的主要内容,如果未能解决你的问题,请参考以下文章

reactjs中如何处理this.setState问题

承诺解决后未触发reactjs render() this.setState 被重新分配

ReactJS:警告:setState(...):在现有状态转换期间无法更新

ReactJS setState 多维数组变量键在子数组中

reactjs——解决setState异步问题

ReactJS , setState 发出 onChange 事件