React 异步,同步?

2021-12-22  本文已影响0人  coderhzc

一.如何获取异步的结果

import React, { Component } from "react";

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      message: "helloWorld",
    };
  }
  render() {
    const { message } = this.state;
    return (
      <div>
        <h1>{message}</h1>
        <button onClick={() => this.changeText()}>改变文本</button>
      </div>
    );
  }

  changeText() {
    // setState是异步更新的
    // this.setState({
    //   message: "楚楚胡",
    // });
    // console.log(this.state.message); // 这种打印的还是你以前的代码 "helloWorld"

    this.setState(
      {
        message: "楚楚胡",
      },
      () => {
        // 1. 获取异步更新的state
        console.log(this.state.message); // 楚楚胡
      }
    );
  }

  // 2. 获取异步更新的state
  componentDidUpdate() {
    console.log(this.state.message); // 楚楚胡
  }
}

二. setState一定是异步吗?

(1) 在setTimeout或者原生dom事件中,setState是同步;

在setTimeout中的更新:

addClick() {
    // 情况一:这种就变为同步的代码了
    setTimeout(() => {
      this.setState({
        message: "楚楚胡~",
      });
      console.log(this.state.message); // 这种就变为同步了
    }, 0);
  }

情况二:这种就变为同步的代码了

componentDidMount() {
document.getElementById("btn").addEventListener("click", () => {
this.setState({
message: "楚楚胡~",
});
console.log(this.state.message); // 这种就变为同步了
});
}

(2) 在组件生命周期或React合成事件中,setState是异步;

 addClick() {
    this.setState({
      counter: this.state.counter + 1
    });
  }
上一篇下一篇

猜你喜欢

热点阅读