首页 > 编程语言 >Vue源码学习(十二):列队处理(防抖优化,多次调用,只处理一次)

Vue源码学习(十二):列队处理(防抖优化,多次调用,只处理一次)

时间:2023-10-19 19:13:44浏览次数:45  
标签:异步 防抖 Vue updata watcher 源码 列队 id pending

好家伙,

 

本篇讲的是数据更新请求列队处理

 

1.一些性能问题

数据更新的核心方法是watcher.updata方法

实际上也就是vm._updata()方法,

vm._updata()方法中的patch()方法用于将新的虚拟DOM树与旧的虚拟DOM树进行比较,

并将差异更新到实际的DOM树上.

这一步是非常消耗性能的

 

2."问题"实例

来写一个多次更新的例子

 这里我们可以看到,updata被触发了三次,也就是 .patch()方法被触发了三次

同样的操作做了三次,显然后两次是多余的

这显然是可以优化的,我们来做些优化吧

 

3.优化

先讲一下思路组件与watcher一一对应

1.当三个请求同时发出,我们只进行一次操作

2.将需要操作的watcher存到一个数组中,在单次操作中调用更新方法

有点抽象

上代码:

class Watcher{
    /* 
    xxx
    */
    run(){
        this.getter()
    }
    updata() { //三次
        //注意:不要数据更新后每次都调用 get 方法 ,get 方法回重新渲染
        //缓存
        // this.get() //重新渲染
        queueWatcher(this)
    }

}
let queue = [] // 将需要批量更新的watcher 存放到一个列队中
let has = {}
let pending = false

function queueWatcher(watcher) {
    let id = watcher.id // 每个组件都是同一个 watcher
       console.log(id) //去重
    if (has[id] == null) {//去重
        //列队处理
        queue.push(watcher)//将wacher 添加到列队中
        has[id] = true
        //防抖 :用户触发多次,只触发一个 异步,同步
        if (!pending) {
            // 异步:等待同步代码执行完毕之后,再执行
            setTimeout(()=>{
              queue.forEach(item=>item.run())
              queue = []
              has = {}
              pending = false
            },0)
        }
        pending = true
    }
}

此处,

 

a. 首先获取到 watcher 的 id(假设每个组件都是同一个 watcher)。

b. 判断队列中是否已存在相同的 watcher,通过判断 has 对象中是否存在该 id 来实现。

c. 如果队列中不存在该 watcher,将其添加到队列中,并将该 id 添加到 has 对象中,表示已存在。

d. 通过 setTimeout 将队列中的所有 watcher 的 run 方法封装成一个异步任务,等待当前同步代码执行完毕后执行。

e. 设置 pending 为 true,表示当前有一个异步任务正在执行。

f.  执行setTimeout()中的代码

 

这样第一次执行了if()块,随后的几次操作中pending被设置为true后if()块不再执行

同步任务完成后,执行异步任务

 

这样,通过异步处理的方式实现了,触发多次,只执行一次的效果

 

标签:异步,防抖,Vue,updata,watcher,源码,列队,id,pending
From: https://www.cnblogs.com/FatTiger4399/p/17775316.html

相关文章

  • 基于Java Web的多功能旅游网站的设计与实现-计算机毕业设计源码+LW文档
    摘 要 随着时代的发展,人们对旅游也越来越重视,近些年来我国的旅游产业也发生了翻天覆地的变化,但是很多人在出去旅游的时候不知道去哪里旅游,在预订酒店和机票的时候也没有一个综合性的旅游网站,为了让人们的旅游变的更加的方便,为此我开发了本基于JavaWeb的多功能旅游网站本基于......
  • 构建高效、安全的在线考试系统:基于Spring Boot和Vue的前后端分离之道
    本文介绍了如何使用SpringBoot和Vue构建一个前后端分离的在线考试系统。通过结合这两个流行的技术框架,我们能够快速搭建一个功能完善、易于扩展的系统,提供高效、安全和可靠的在线考试服务。本文将详细介绍系统的架构设计和关键技术实现,并提供相关代码示例。随着互联网的普及,越来越......
  • 基于Java的智慧图书管理系统-计算机毕业设计源码+LW文档
    摘要随着时代的发展,图书的重要性显示的越来越突出了,尤其是知识大爆炸的这个年代,人们需要掌握的知识也越来越多,只有不断的提高自己才能够更好的立足于社会,但是通常情况下很多图书的价格比较高,这个时候就可以通过图书馆借阅图书来达到图书阅读的目的,为了让图书借阅变的更加的方便我......
  • 基于Python的《计算机组成原理》在线学习平台-计算机毕业设计源码+LW文档
    摘 要随着互联网的发展,通过计算机来学习是当前非常流行的一种学习方式。通过课程虽然可以面对面的进行交流和学习,但是很多时候因为地区和空间的限制会受到很多的影响但是通过网络来进行学习可以打破这一局限性,为此我开发了本基于Python的《计算机组成原理》在线学习平台网站本......
  • 基于Python的招聘网站爬虫及可视化的实现-计算机毕业设计源码+LW文档
    一、内容框架(一)主要内容论文按照项目的研究内容及技术路线,分为六章进行论述:第一章为概述,介绍了数据可视化和招聘网站的研究背景以及研究意义,分析了数据可视化和招聘技术的发展,对论文的研究内容做出阐述,最后简述了本文的章节安排。第二章为招聘数据可视化以及相关职位推荐系统使......
  • 基于python的旅游网站-计算机毕业设计源码+LW文档
    摘 要 随着时代的发展,人们对旅游也越来越重视,近些年来我国的旅游产业也发生了翻天覆地的变化,但是很多人在出去旅游的时候不知道去哪里旅游,在预订酒店和机票的时候也没有一个综合性的旅游网站,为了让人们的旅游变的更加的方便,为此我开发了本基于python的旅游网站本基于python的......
  • nacos源码启动
    Nacos2.3.0-SNAPSHOT最新版本源码启动最近研究nacos源码启动,把遇到的问题总结一下,希望可以帮助到大家1.nacos官方源码登陆从github上下载最新源码,github地址为https://github.com/alibaba/nacos.git用idea打开nacos项目找到/confg/src/main/resource/META......
  • 解决vue单页面程序经过hbuilder打包成apk后物理按键会直接退出程序的问题
    解决方法是在项目index.html文件中写入 <script>   document.addEventListener('plusready',function(){     varwebview=plus.webview.currentWebview();     plus.key.addEventListener('backbutton',function(){      ......
  • 【ue源码】定制-蓝图部分
    今天在更新UE的伤害系统的时候出现了一个问题:  多个地方频繁调用一个函数,而这个函数肯定做优化,具体就是,把对应数据放入到队列,另外一个地方慢慢消费这个队列,那么问题出现了,我使用的UE只有Single,TArray,TMap以及TSet这几个容器,如果使用队列,那么问题来了,我如何弄出一个我需要......
  • vue 组件之间的数据传递
    一、组件之间的关系父子关系、兄弟关系、跨级关系二、父子之间数据传递1、父组件向子组件传递【使用 props】第一步:在父组件中使用子组件时,给子组件绑定属性第二步:在子组件中使用props接收绑定的属性值2、子组件向父组件传递【使用 $emit】第一步:在子组件中通......