我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React 中 setState 的异步操作案例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React 中 setState 的异步操作案例详解

前言

在使用state的时候, 如果我们企图直接修改state中的某一个值之后直接打印(使用)他,就会发现,他其实并没有改变。

就像下面的例子,企图通过点击事件之后就使用修改之后的state的值,但是会发state中的并没有被立即修改,还是原先的值,我们都知道那是因为 setState就相当于是一个异步操作,不能立即被修改。

import React, { Component } from 'react';
export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '今天是七夕节'
    };
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    this.setState({
      name: '跟你这只单身狗有什么关系'
    })
    console.log(this.state.name)
  }

  render() {
    return (
      <div>
        <h1>{this.state.name}</h1>
        <button onClick={this.handleClick}>点击查看</button>
      </div>
    )
  }
}

 还是只能获取到之前的值。但是我们就是想要立即获取,咋整呢

第一种:

这个回调函数会在修改了state之后才会执行,这就可以使用修改之后的state的值。

import React, { Component } from 'react';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '今天是七夕节'
    };
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    this.setState({
      name: '跟你这只单身狗有什么关系'
    }, () => {
      console.log(this.state.name)
    })
  }

  render() {
    return (
      <div>
        <h1>{this.state.name}</h1>
        <button onClick={this.handleClick}>点击查看</button>
      </div>
    )
  }
}

第二种:

操作异步函数,用 async / await

import React, { Component } from 'react';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '今天是七夕节'
    };
    this.handleClick = this.handleClick.bind(this)
  }
  async handleClick() {
    await this.setState({
      name: '跟你这只单身狗有什么关系'
    })
    console.log(this.state.name)
  }
  render() {
    return (
      <div>
        <h1>{this.state.name}</h1>
        <button onClick={this.handleClick}>点击查看</button>
      </div>
    )
  }
}

第三种:

setstate 可以接收一个回调函数,而不是一个对象,这个回调函数有两个参数,一个是接收前一个状态值作为第一个参数,并将更新后的值作为第二个参数。

import React, { Component } from 'react';
export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '今天是七夕节'
    };
    this.handleClick = this.handleClick.bind(this)
  }
  handleClick() {
    this.setState(() => {
      return {
        name: `跟你这只单身狗有什么关系`
      }
    }, () => {
      console.log(this.state.name)
    })
  }
  render() {
    return (
      <div>
        <h1>{this.state.name}</h1>
        <button onClick={this.handleClick}>点击查看</button>
      </div>
    )
  }
}

还可以拿到之前的值,进行修改

handleClick() {
  this.setState((prevState) => {
    return {
      name: `${prevState.name},但是跟你这只单身狗有什么关系`
    }
  }, () => {
    console.log(this.state.name)
  })
}

react中 state的值在修改了之后并不会立即被修改,setState通过一个队列机制实现state的更新。当执行setState时,会把需要更新的state合并后放入状态队列,而不会立刻更新this.state,利用这个队列机制可以高效的批量的更新state。

 setState之后不会立马触发更新,它会根据当前isBatchingUpdate 判断是否处于批量更新中,如果当前isBatchingUpdate为true,说明处于批量更新中,它会将要更新的值放入到一个队列中,随后将要更新的组件放入dirtyComponent中,当本次批量更新结束后,会将isBatchingUpdate中设置为false,开启本次的批量更新,情况队列,会用object.assign()将多次更新进行一个合并。 react会开启一个事务机制,进行dom diff算法等来进行跟新。

React 中的 setState 为什么需要异步操作?

  • 保持内部一致性:props 的更新是异步的,因为re-render父组件的时候,传入子组件的props才变化;为了保持数据一致,state也不直接更新,都是在flush的时候更新
  • 将state的更新延缓到最后批量合并再去渲染对于应用的性能优化是有极大好处的,如果每次的状态改变都去重新渲染真实 DONM,那么它将带来巨大的性能消耗
  • 立即更新回来视觉上的不适应,比如在页面打开时候,多个请求发布导致频繁更改Loading 状态,会导致 Loading 图标闪烁

什么时候setState会进行同步操作?

setState只在合成事件和钩子函数中是“异步”的,在原生事件和setTimeout 中都是同步的。

到此这篇关于React 中 setState 的异步操作案例详解的文章就介绍到这了,更多相关React setState异步内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React 中 setState 的异步操作案例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React中setState同步和异步的示例分析

这篇文章主要介绍React中setState同步和异步的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! React起源于Facebook的内部项目。React的出现是革命性的创新,React的是一个颠覆式的前
2023-06-15

React中setState同步或异步问题的示例分析

这篇文章主要为大家展示了“React中setState同步或异步问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React中setState同步或异步问题的示例分析”这篇文章吧。1.
2023-06-25

react 中 mobx的使用案例详解

这篇文章主要介绍了react 中 mobx的使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

Redux中进行异步操作(网络请求)的示例方案

这篇文章主要介绍了Redux中进行异步操作(网络请求)的方案,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-22

C++ BoostAsyncSocket实现异步反弹通信的案例详解

这篇文章主要为大家详细介绍了C++ BoostAsyncSocket如何实现异步反弹通信,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
2023-03-19

Java中Properties类的操作实例详解

Java中Properties类的操作实例详解知识学而不用,就等于没用,到真正用到的时候还得重新再学。最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写
2023-05-31

详解 Golang 中的页面跳转操作步骤

Golang 是一种由谷歌开发的开源编程语言,广泛应用于Web开发中。在Web开发过程中,页面跳转是一个非常常见的操作,本文将详细解释在 Golang 中进行页面跳转的步骤,并提供具体的代码示例。1. 创建一个简单的 Web 服务器首先
详解 Golang 中的页面跳转操作步骤
2024-03-05

Java中使用同步回调和异步回调的示例详解

这篇文章主要介绍了Java中使用同步回调和异步回调的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-16

在Python中操作MongoDB的详细教程和案例分享

目录引言1. 环境准备1.1 安装MongoDB1.2 安装PyMongo2. 连接MongoDB3. 插入数据3.1 插入单条数据3.2 插入多条数据4. 查询数据4.1 查询所有文档4.2 查询单个文档4.3 带条件查询4.4 模糊查询
在Python中操作MongoDB的详细教程和案例分享
2024-08-14

编程热搜

目录