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
相关推荐
kyriewen1 天前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒1 天前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
山河木马1 天前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
小林攻城狮1 天前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦1 天前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer1 天前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队1 天前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY1 天前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_1 天前
OpenSpec 完整详细介绍
前端·后端
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端