javascript - 同时设置多个(相互依赖的)状态值

标签 javascript reactjs

想象一下这段代码:

class App extends React.Component {
  state = {
    name: "george",
    counter: 1
  };

  onClick() {
    this.setState({
      counter: 123,
      name: this.state.name + this.state.counter
    });


  }

  render() {
    return (
      <div
        className="App"
        onClick={() => {
          this.onClick();
        }}
      >
        <h1>Hello CodeSandbox</h1>
        <h2>{this.state.name}</h2>
        <h2>{this.state.counter}</h2>
      </div>
    );
  }
}

如果我单击 div ,输出为:

george1
123

您可以看到state.name的值为george1其中包含当时当前的counteronClick 被调用。不过,state.counter 值本身具有新值。

这怎么解释?因为如果我这样做:

 onClick() {
    this.setState({
      counter: 123
    });

    setTimeout(() => {
      this.setState({
        name: this.state.name + this.state.counter
      });
    }, 1000);
  }

现在输出是

george123
123

基本上是相同的代码,但时间不同。 那么如何解释这种行为呢? 为什么在第一种情况下它会将 this.state.counter 的当前值(在点击时)嵌入到 this.state.name 中? 在第二种情况下不是吗?

Demo .

<小时/>

我知道是否希望将 counter 的旧值嵌入到 this.state.name 中,并更新 this.state.counter >,我也可以这样做:

 onClick() {
    this.setState({ // even safer to use functional setState here
        name: this.state.name + this.state.counter
    }, ()=>{
       this.setState({ // and here
         counter:123
       })
    });


  }

它比第一种方法更安全吗(结果相同)?

最佳答案

您在两个示例中都使用了 counter 的值。不同之处在于计数器的值何时发生变化。在此示例中:

onClick() {
    this.setState({
      counter: 123,
      name: this.state.name + this.state.counter
    });

名称为 george1,因为 this.state.counter 仍设置为 1(尚未更新)。

在此示例中:

this.setState({
      counter: 123
    });

    setTimeout(() => {
      this.setState({
        name: this.state.name + this.state.counter
      });
    }, 1000);

您首先要更新 counter 的值,因此超时后 this.state.counter 将引用新值,因此 name 值将为 george123

作为旁注,如果您需要在 setState 函数中引用状态,您应该使用回调,以便保证状态的正确值。

关于javascript - 同时设置多个(相互依赖的)状态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57976686/

相关文章:

javascript - 一个非常奇怪的问题 - 网站在 FF3.0 中工作,但在 FF3.5 中不起作用

javascript - 将 localstorage 对象放入变量中

javascript - 在同一个组件中进行两个 API 调用 - ReactJS

javascript - 尝试在 MAP 内运行函数

javascript - AWS s3 存储桶上的 React-Router 位置不起作用

javascript - SelectField - 更改弹出框颜色

javascript - 从 h1 标签获取链接并使图像可下载

javascript - AngularJS - 无法将 ngFormController 附加到 $scope

javascript - 如何将带有数据驱动下拉列表的行添加到数据表

reactjs - WithProps 与 withHandlers