当前位置: 首页 > 知识库问答 >
问题:

为什么调用反应setState方法不会立即改变状态?

宋畅
2023-03-14

我正在阅读 reactjs 文档的 Forms 部分,并尝试使用此代码来演示 onChange 用法 (JSBIN)。

var React= require('react');

var ControlledForm= React.createClass({
    getInitialState: function() {
        return {
            value: "initial value"
        };
    },

    handleChange: function(event) {
        console.log(this.state.value);
        this.setState({value: event.target.value});
        console.log(this.state.value);

    },

    render: function() {
        return (
            <input type="text" value={this.state.value} onChange={this.handleChange}/>
        );
    }
});

React.render(
    <ControlledForm/>,
  document.getElementById('mount')
);

当我更新


共有3个答案

司徒博容
2023-03-14

您可以尝试使用ES7 async/await。例如,使用您的示例:

handleChange: async function(event) {
    console.log(this.state.value);
    await this.setState({value: event.target.value});
    console.log(this.state.value);
}
戚峻
2023-03-14
匿名用户

如 React 文档中所述,不能保证 setState 是同步触发的,因此您的控制台.log可能会在更新之前返回状态。

Michael Parker提到在<code>setState<code>中传递回调。处理状态更改后的逻辑的另一种方法是通过componentDidUpdate生命周期方法,这是React文档中推荐的方法。

通常,我们建议对此类逻辑使用componentDidUpdate()。

当可能有连续的< code>setState被触发,并且您想在每次状态改变后触发相同的函数时,这特别有用。您可以将函数放在< code>componentDidUpdate中,并在必要时在其中添加特定的逻辑,而不是向每个< code>setState添加回调。

// example
componentDidUpdate(prevProps, prevState) {
  if (this.state.value > prevState.value) {
    this.foo();  
  }
}

季稳
2023-03-14

来自 React 的文档:

setState()不会立即改变this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。无法保证对setState的调用同步操作,并且可能会对调用进行批处理以提高性能。

如果希望在发生状态更改后执行函数,请将其作为回调传入。

this.setState({value: event.target.value}, function () {
    console.log(this.state.value);
});
 类似资料:
  • 问题内容: 好的,我会尽快解决这个问题,因为它应该很容易解决… 我读过很多类似的问题,答案似乎非常明显。首先,我不需要查找任何内容!但是…我有一个错误,我无法理解如何修复或为什么会发生。 如下: 与此相关的代码更多,但这就是我的问题所在。应该工作吧? 我也尝试过这个: 所以我有这两个,两者应该相同。我实际上是将状态设置为与其上方的行相同! 但是它总是返回与应有的相反的结果。 我用的时候也一样; 如

  • 好吧,我会尽快解决的,因为这应该是一个很容易的解决办法... 我读过一堆类似的问题,答案似乎相当明显。从一开始我就不用抬头看了!但是...我有一个错误,我无法理解如何修复或为什么它会发生。 具体如下:

  • 问题内容: 我正在阅读reactjs文档的Forms部分,只是尝试了这段代码来演示用法(JSBIN)。 在浏览器中更新值时,回调内的第二个与第一个相同,为什么在回调范围内看不到结果? 问题答案: 从React的文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。无法保证对呼叫的同步操作,并且可以为提高性能而对呼叫进行批量处理。 如果要在状态更改发生后执行某个函数

  • 问题内容: 我正在阅读reactjs文档的Forms部分,只是尝试了这段代码来演示用法(JSBIN)。 onChange 当我在浏览器中更新值时,回调内的第二个与第一个相同,为什么在回调范围内看不到结果? 问题答案: 从React的文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。无法保证对呼叫的同步操作,并且可以为提高性能而对呼叫进行批量处理。 如果要在状态

  • 我想问一下,为什么在执行事件时,我的状态没有改变。我已经搜索到需要在构造函数中绑定函数,但是状态仍然没有更新。 下面是我的代码:

  • 问题内容: 我想问为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 这个回调真的很混乱。只需使用async await代替: