React 之 setState

115 阅读1分钟

前言

React并没有实现类似于Vue2中的Object.defineProperty或者Vue3中的Proxy的方式来监听数据的变化; 我们必须通过setState来告知React数据已经发生了变化,setState方法是从Component中继承过来的。 本篇介绍setState相关概念和使用方法。

一. setState使用方式

1.基本使用

import React, { Component } from "react";

export class App extends Component {
  constructor(props) {
    super(props);

    this.state = {
      message: "Hello wo",
    };
  }

//1.基本使用
  changeText() {
    this.setState({
      message: "hhhh",
    });

  render() {
    const { message } = this.state;

    return (
      <div>
        <h2>message: {message}</h2>
        <button onClick={(e) => this.changeText()}>修改文本</button>
      </div>
    );
  }
}
export default App;

2.传入一个回调函数

  • 可以在回调函数中编写新的state的逻辑(该state是原先的
  • 当前的回调函数会将之前的state和props传递进来
 changeText() {
 
    //props是父组件传递的参数
    this.setState((state, props) => {
      console.log(this.state.message, this.props);

      return {
        message: "hhhh",
      };
    });
    console.log("-----", this.state.message);
  }

运行结果:

image.png

3.传入第二个参数: callback

由上方结果可知setStateReact的事件处理中是一个异步调用, 如果希望在数据更新之后(数据合并), 获取到对应的结果执行一些逻辑代码,可以在setState中传入第二个参数: callback

 changeText() {
    this.setState({ message: "hhh" }, () => {
      console.log("+++++", this.state.message);
    });
    console.log("-----", this.state.message);
  }

运行结果:

image.png

二. 为什么setState是异步的?

setState被设计为异步的,可以显著提升性能;

如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的;  
最好的办法应该是获取到多个更新,之后进行批量更新;

如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步;  
state和props不能保持一致性,会在开发中产生很多的问题;