经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
React?setState是异步还是同步原理解析
来源:jb51  时间:2022/11/19 17:13:10  对本文有异议

setState异步更新

开发中当组件中的状态发生了变化,页面并不会重新渲染。我们必须要通过setState来告知React数据已经发生了变化,重新渲染页面。

先来看下面的例子:

  1. constructor() {
  2. super();
  3. this.state = {
  4. message: "Hello World",
  5. };
  6. }
  7. changeText() {
  8. this.setState({
  9. message: "Hello React",
  10. });
  11. console.log(this.state.message); // Hello World
  12. }

最终打印的结果是Hello World;

可见setState是异步的操作,我们并不能在执行完setState之后立马拿到最新的state的结果

那么为什么setState设计为异步呢?

setState设计为异步,可以显著的提升性能

  • 如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的;
  • 最好的办法是获取多个更新,之后进行批量处理;

如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步;

state和props不能保持一致性,会在开发中产生很多的问题;(比如,组件嵌套时影响子组件中的状态)

如何获取异步的结果

setState的回调

setState接受两个参数:第二个参数是一个回调函数,这个回调函数会在更新后会执行;

  1. changeText() {
  2. this.setState({
  3. message: "Hello React",
  4. },()=>{
  5. console.log('-----',this.state.message); // Hello React
  6. });
  7. }

也可以在生命周期函数中获取:

  1. componentDidUpdate(prevProps, prevState, snapshot){
  2. console.log(this.state.message);// Hello React
  3. }

setState一定是异步的吗?

React18版本之前

其实可以分成两种情况:

  • 在组件生命周期或React合成事件中,setState是异步的;
  • 在setTimeout或者原生DOM事件中,setState是同步的

验证一:在setTimeout中的更新:

  1. setTimeout(() => {
  2. this.setState({
  3. message: "Hello React",
  4. });
  5. console.log(this.state.message); // Hello React
  6. }, 0);

验证二:原生DOM事件:

  1. componentDidMount() {
  2. const btnEl = document.querySelector("#btn");
  3. btnEl.addEventListener("click", () => {
  4. this.setState({
  5. message: "Hello React",
  6. });
  7. console.log(this.state.message); // Hello React
  8. });
  9. }

React18版本之后

setState默认是异步的

  • 在React18之后,默认所有的操作都被放到了批处理中(异步处理)

如果希望代码可以同步拿到,则需要执行特殊的flushSync操作:

  1. import { flushSync } from "react-dom";
  2. changeText() {
  3. flushSync(() => {
  4. this.setState({
  5. message: "Hello React",
  6. });
  7. });
  8. console.log(this.state.message); // Hello React
  9. }

以上就是React setState是异步还是同步原理解析的详细内容,更多关于React setState异步同步的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号