React setState详解

  • Post author:
  • Post category:其他


1. setState的三种写法


(1) 普通写法


可以直接传入对象,当调用setState后会与原state对象进行合并操作

import React, { Component } from 'react'

export default class App extends Component {
  constructor(){
    super()
    this.state = {
      message: 'hello world'
    }
  }

  changeMessage(){
    // 第一种方式
    this.setState({
      message: this.state.message + '!'
    })
  }

  render() {
    return (
      <div>
        <button onClick={ ()=> this.changeMessage() }>修改消息</button>
        <div>{this.state.message}</div>
      </div>
    )
  }
}


(2)函数写法


传入函数,传入的函数可以接收两个参数,当前的state和props


可以在函数中编写逻辑


函数需要返回一个对象,这个对象会与原state对象进行合并操作

import React, { Component } from 'react'

export default class App extends Component {
  constructor(){
    super()
    this.state = {
      message: 'hello world'
    }
  }

  changeMessage(){
    // 第二种方式
    // 好处一:可以在回调函数中编写新的state的逻辑
    // 好处二:当前的回调函数会将之前的state和props传递进来
    this.setState((state,props)=>{
      return {
        message: this.state.message + '!'
      }
    })
  }

  render() {
    return (
      <div>
        <button onClick={ ()=> this.changeMessage() }>修改消息</button>
        <div>{this.state.message}</div>
      </div>
    )
  }
}


(3) 两个参数


第二个参数是一个回调函数,当state中的数据修改后,会调用

import React, { Component } from 'react'

export default class App extends Component {
  constructor(){
    super()
    this.state = {
      message: 'hello world'
    }
  }

  changeMessage(){
    // 第三种方式
    // 如果希望在数据更新之后,获取的对应的结果执行一些逻辑代码
    // 那么可以在setState中传入第二个参数:callback
    this.setState({
      message: this.state.message + '!'
    },() => {
      // 这里会打印最新的message
      console.log(this.state.setState)
    })
  }

  render() {
    return (
      <div>
        <button onClick={ ()=> this.changeMessage() }>修改消息</button>
        <div>{this.state.message}</div>
      </div>
    )
  }
}

2. setState同步异步

1.setState在合成事件和生命周期函数中是异步的,在原生事件和setTime中都是同步的。

(合成事件是在类组件中的方法,原生事件是通过addEventListener绑定的原生事件)

2.但是在react18之后,在原生事件和setTime中也变为异步的了。



版权声明:本文为freeman_xv1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。