14. setState是异步更新

setState是异步更新

  • 1.3.1. setState的更多用法
    *

    1. setState处理数据的原理
    • 1.1. 原理:把原来的state新的state做了一个合并,如果出现属性一样的情况下,用新属性把原来的属性给覆盖掉,内部做了一个这样的事情,做完合并值之后再在合适的时机调用render函数

    • 1.2. 为什么是合适时机调用render函数呢?

      • render函数不是立马调用的,因为它还涉及到一些性能优化的东西,然后在去调用render函数
    • 1.3. 数据合并的示例图如下:

      1. 用法一:基本使用
      • 关键代码如下:

        js 复制代码
          this.setState({
            message: '你好啊 李银河'
          })
      1. 用法二:setState可以传入一个回调函数
      • 3.1. 传入回调函数的代码运行原理:

        • 原理:给setState传入了一个回调函数,内部会主动回调这个函数,并且拿到结果进行一个值合并,在回调函数的过程中,会把原来的state和props传递过来
      • 3.2. 传入回调函数的好处:

        • 好处一: 可以在回调函数中编写新的state的逻辑(写在外面也可以,写在函数里面内聚性更强)
        • 好处二: 当前回调函数会将之前的state和props传递进来
      • 3.2. 关键代码如下:

        js 复制代码
          // 好处一: 可以在回调函数中编写新的state的逻辑(写在外面也可以,写在函数里面内聚性更强)
          // 好处二: 当前回调函数会将之前的state和props传递进来
          this.setState((state, props) => { // 原来的state,props可以拿到
            // 1. 编写一些对新的state处理逻辑
            // 2. 可以获取之前的state和props
            // 原理:给setState传入了一个回调函数,内部会主动回调这个函数,并且拿到结果进行一个值合并,在回调函数的过程中,会把原来的state和props传递过来
            console.log('state===', state, props) 
            console.log(this.state.message, this.props)
            return {
              message: '你好啊,李银河'
            }
          })
      1. 用法三:setState在React的事件处理中是一个异步调用
        1. 异步调用:它不会阻塞接下来的代码执行,这个操作并不会立马完成的可能需要经过一定的时间后真正的完成你对应的操作
        1. 如果希望在数据更新之后(数据合并), 获取到对应的结果执行一些逻辑代码, 那么可以在setState中传入第二个传输:callback
        1. 示例代码如下:
        js 复制代码
          this.setState({ message: '你好啊,李银河' }, () => {
            console.log('+++++++++++++', this.state.message)
          })
          console.log('----------', this.state.message)
        1. 代码运行图如下:
      1. 完整代码如下:
      js 复制代码
        import React, { Component } from 'react'
      
        export class App extends Component {
          constructor() {
            super()
            this.state ={
              message: 'hello world',
              counter: 1
            }
          }
          changeText () {
            // 1. setState更多用法
            // 1. 基本使用 setState的原理:(Object.assign(this.state, newState)合并后 -> render()) 
            // setState的原理:把原来的state和新的state做了一个合并,如果出现属性一样的情况下,用新属性把原来的属性给覆盖掉,内部做了一个这样的事情,做完合并值之后再在合适的时机调用render函数
            // render函数不是立马调用的,因为它还涉及到一些性能优化的东西,然后在去调用render函数
            // this.setState({
            //   message: '你好啊 李银河'
            // })
      
            // 2. setState可以传入一个回调函数
            // 好处一: 可以在回调函数中编写新的state的逻辑(写在外面也可以,写在函数里面内聚性更强)
            // 好处二: 当前回调函数会将之前的state和props传递进来
            // this.setState((state, props) => { // 原来的state,props可以拿到
            //   // 1. 编写一些对新的state处理逻辑
            //   // 2. 可以获取之前的state和props
            //   //  给setState传入了一个回调函数,内部会主动回调这个函数,并且拿到结果进行一个值合并,在回调函数的过程中,会把原来的state和props传递过来
            //   console.log('state===', state, props) 
            //   console.log(this.state.message, this.props)
            //   return {
            //     message: '你好啊,李银河'
            //   }
            // })
      
            // 3. setState在React的事件处理中是一个异步调用
            // 异步调用:它不会阻塞接下来的代码执行,这个操作并不会立马完成的, 可能需要经过一定的时间后真正的完成你对应的操作
            // - 如果希望在数据更新之后(数据合并), 获取到对应的结果执行一些逻辑代码
            // - 那么可以在setState中传入第二个传输:callback
            this.setState({ message: '你好啊,李银河' }, () => {
              console.log('+++++++++++++', this.state.message)
            })
            console.log('----------', this.state.message)
      
          }
          increment () {
          
            this.setState({
              counter: this.state.counter + 1
            })
          
          }
          render() {
            const { message, counter } = this.state
            return (
              <div>
                <h2>message: {message}</h2>
                <button onClick = {e => this.changeText()}>修改文本</button>
                <h2>当前计数:{ counter }</h2>
                <button onClick= { e => this.increment()}>+1</button>
              </div>
            )
          }
        }
      
        export default App
相关推荐
badhope12 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园13 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
hpoenixf13 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特13 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
C++ 老炮儿的技术栈14 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl14 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
泯泷14 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
Liu6288814 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手14 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星14 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘