React 中 setState详解

news/2024/6/1 22:46:28 标签: react.js, 前端

最近复习了一些关于react的基础,记录一下,setState使用的细节。
setState的异步更新
自定义事件中为异步更新

<div>
  <h2>{this.state.message}</h2>
  <button onClick={e => this.changeText()}>改变文本</button>
  </div>
changeText() {
  this.setState({
    message: "Hello React"
  })
  console.log(this.state.message);  // Hello World, 并不能同步拿到最新值 Hello React
}

为什么setState设计为异步呢?
setState设计为异步,可以显著的提升性能;

如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的;最好的办法应该是获取到多个更新,之后进行批量更新;
如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步;state和props不能保持一致性,会在开发中产生很多的问题

及时获取到setState异步更新后的值:
1.setState(partialState, callback) 通过回调,callback方法获取,

changeText() {
  this.setState({
    message: "Hello React"
  }, () => {
    console.log(this.state.message); // Hello React
  });
}

2.生命周期函数 componentDidUpdate 获取

componentDidUpdate(prevProps, provState) {
  console.log(this.state.message); // Hello React
}

setState的同步更新
setTimeout 中为同步更新

changeText() {
  setTimeout(() => {
    this.setState({
      message: "Hello React"
    });
    console.log(this.state.message); // Hello React
  }, 0);
}

原生DOM事件中为同步更新

const btnEl = document.getElementById("btn");
  btnEl.addEventListener('click', () => {
    this.setState({
      message: "Hello React"
    });
  console.log(this.state.message);  // Hello React
})

setState的数据合并

使用 Object.assign(target, …sources)来完成的,每次setState并没有直接替换state中的所有数据,而是覆盖差异项,就是setState中的key项

setState的方法合并

多个setState连续执行,最终只会执行一个,例子中最后counter只增加了 1

increment() {
  this.setState({
    counter: this.state.counter + 1
  });
  this.setState({
    counter: this.state.counter + 1
  });
  this.setState({
    counter: this.state.counter + 1
  });
}

setState(callback) 取消合并,例子中最后counter只增加了 3

increment() {
  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })

  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })

  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })
  }

总结

在组件生命周期或React合成事件中,setState是异步; 在定时器或原生dom事件中,setState是同步;
setState数据合并,实际上是Object.assign(target, …sources)
通过setState(callback)的方式可取消setState的多个合并


http://www.niftyadmin.cn/n/5135237.html

相关文章

黑豹程序员-架构师学习路线图-百科:Log4j 业务日志代码分离

文章目录 1、什么是Log4j&#xff1f;2、发明了日志级别3、为什么要使用Log4j 1、什么是Log4j&#xff1f; Log4j是Apache的一个开源项目&#xff0c;它有三大组件&#xff1a; 1、Logger&#xff1a; 日志对象&#xff0c;负责捕捉日志记录信息&#xff1b; 2、Appender&am…

react和vue的区别

react和vue区别的主要区别 React和Vue是两种流行的JavaScript库&#xff0c;用于构建用户界面。它们有一些区别&#xff0c;包括以下几个方面&#xff1a; 学习曲线&#xff1a; React相对来说更简单&#xff0c;因为它只关注视图层&#xff0c;而且有较少的概念和API。Vue则提…

JavaScript中,一个字符串A在另外一个字符串B中重复出现,需要从B中去除A包括A之前和A之后的若干字符串

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>重复除去一个字符串前若干和后若干个字符</title> </head> <body> <h1>我的网页</h1> <p id"demo">我的第一…

RSA加解密

头一次接触算法 啊好困 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;算法是一种非对称加密算法 密钥生成&#xff1a;选择两个大质数p和q&#xff0c;计算它们的乘积n p * q。然后选择一个与φ(n)&#xff08;n的欧拉函数&#xff09;互质的整数e&#xff0c;通常选择65…

机器狗装上 ChatGPT 大脑当导游;AI 正在学习「超人的说服力」丨 RTE 开发者日报 Vol.73

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

AM@微元法和定积分的应用@平面图形面积@立体体积@曲线弧长

文章目录 abstract微元法平面图形的面积极坐标上图形面积曲边扇形面积 平行截面面积为已知的立体体积旋转体的体积绕 x x x轴旋转绕 y y y轴旋转另一类型旋转体积 曲线弧长参数方程表示的曲线弧长直角坐标方程表示的曲线弧长极坐标方程表示得曲线弧长小结 abstract 微元法定积…

基于SSM的乐器购物网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

MySQL - 慢查询

慢查询日志用于记录执行时间超过设定的时间阈值的 SQL 查询语句。它的目的是帮助数据库管理员识别和优化执行时间较长的查询&#xff0c;以提高数据库性能&#xff1a; 慢查询定义&#xff1a;慢查询日志记录那些执行时间超过 long_query_time 参数设定的时间阈值的 SQL 查询语…