vue的异步数据更新机制与$nextTick用法解读

 更新时间:2023年03月28日 08:37:33   作者:liguoyuan819  
这篇文章主要介绍了vue的异步数据更新机制与$nextTick用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue异步数据更新机制与$nextTick

vue异步更新dom

vue的响应式更新dom是异步执行的,不是数据发生变化之后dom立即发生变化,而是按照一定的逻辑更新dom。

具体是vue在检测到数据变化时,vue将开启一个队列,,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这在缓冲中去除重复数据造成的额外的dom操作和计算是非常必要的。在下一个nextTick中,vue执行的是已经去重的实际工作。

理解:vue执行dom更新时异步的,这个异步任务可以当成是一个promise的微任务,对同一个属性值进行多次赋值时,只有最后一次赋值会作为一个promise微任务放到更新队列里面。

$nextTick执行机制

Vue会异步更新DOM,会在当前执行栈的最后更新DOM,这个与JavaScript的原生操作dom有很大区别。vue中的$nextTick再JavaScript中相当于微任务,会在当前所有同步任务执行完之后再执行,$nextTick会得到dom更新后的结果。最后页面渲染是在始终是在微任务执行之后在执行的,所以$nextTick回调执行时还没有渲染,页面上看不到更新后的结果。

vue执行异步更新的目的

vue更新dom的流程:触发setter --> 监听watcher --> 重新渲染 render --> 生成虚拟dom (vdom)--> 更新dom 。如果每一次都执行该流程会非常消耗性能,所以使用异步更新DOM的机制,先对数据修改进行整合去重,再使用最终的结果一次性对DOM进行更新。

vue异步数据更新问题

记录一下出现的问题, 数据翻倍

这是复现问题的代码

 data() {
    return {
      space: "",
      allresult: []
    };
  },
  methods: {
    getmessage() {
      this.allresult = [];
      axios
        .get(
          "https://gist.githubusercontent.com/xiaolannuoyi/9b0defe4959e71fa97e6096cc4f82ba4/raw/4be939123d488cee7ecefc055fb5ecb2ed8d5c8d/test"
        )
        .then(data => {
          console.log(data);
          let result = data.data;
          for (let i = 0; i < result.length; i++) {
            //原因在于这里的this.Allresult
            this.allresult.push({
              id: result[i].id,
              name: result[i].name,
              age: result[i].age
            });
            
          }
            console.log('此时的this.allresult',this.allresult);
        });
    }
  },
  watch: {
    space() {
      console.log("watch");
      this.getmessage();
    }
  },
  mounted() {
    this.space = "123";
    console.log("mounted");
    this.getmessage();
  }

结果

在这里插入图片描述

此时你可以看到第二次的数据时 是 第一次的 2倍

原因

mounted 和 watch 都执行 getmessage 方法,虽然方法之前 对数据进行了清空,但是 异步请求执行的慢,

所以两次调用getmessage相当于 this.allresult = []; this.allresult = []; axios...;axios....: 这个顺序

所以才会出现上述现象

解决

1.修改this.allresult = []的位置

在这里插入图片描述

2.新建一个临时空数组

在这里插入图片描述

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue中v-model失效原因以及解决方案

    vue中v-model失效原因以及解决方案

    这篇文章主要给大家介绍了关于vue中v-model失效原因以及解决方案的相关资料,vue的v-model是一个双向绑定的数据流,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Vue.js处理API请求失败的最佳实践和策略

    Vue.js处理API请求失败的最佳实践和策略

    在现代Web开发中,与后端API的交互是不可避免的,然而,网络请求是不稳定的,可能会因为各种原因失败,因此,优雅地处理API请求失败的情况是提升用户体验和应用稳定性的关键,本文将详细介绍在Vue.js中处理API请求失败的最佳实践和策略,需要的朋友可以参考下
    2024-12-12
  • Vue组件设计-滚动置顶设计案例

    Vue组件设计-滚动置顶设计案例

    这篇文章主要介绍了Vue组件设计-滚动置顶设计案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • vue中循环请求接口参数问题及解决

    vue中循环请求接口参数问题及解决

    这篇文章主要介绍了vue中循环请求接口参数问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • element滚动条组件el-scrollbar的使用详解

    element滚动条组件el-scrollbar的使用详解

    本文主要介绍了element滚动条组件el-scrollbar的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • vue-plugin-hiprint 详细使用

    vue-plugin-hiprint 详细使用

    这篇文章主要介绍了vue-plugin-hiprint 详细使用说明,使用Vue.Draggable库构建可拖拽元素的示例,你可以根据具体需求和技术选型选择适合的库或方法来实现可拖拽元素的功能,需要的朋友可以参考下
    2023-08-08
  • Vue.js中this如何取到data和method里的属性详解

    Vue.js中this如何取到data和method里的属性详解

    methods属性是一个对象,通常我们会在这个对象中定义很多的方法,下面这篇文章主要给大家介绍了关于Vue.js中this如何取到data和method里的属性,需要的朋友可以参考下
    2022-12-12
  • Vue中使用及封装websocket示例详解

    Vue中使用及封装websocket示例详解

    这篇文章主要为大家介绍了Vue中使用及封装websocket示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • vue中$nexttick,$set,$forceupdate的区别

    vue中$nexttick,$set,$forceupdate的区别

    本文主要介绍了vue中$nexttick,$set,$forceupdate的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • element el-tree组件的动态加载、新增、更新节点的实现

    element el-tree组件的动态加载、新增、更新节点的实现

    这篇文章主要介绍了element el-tree组件的动态加载、新增、更新节点的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论