经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Vue源码学习(十二):列队处理(防抖优化,多次调用,只处理一次)
来源:cnblogs  作者:养肥胖虎  时间:2023/10/20 8:45:27  对本文有异议

好家伙,

 

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

 

1.一些性能问题

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

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

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

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

这一步是非常消耗性能的

 

2."问题"实例

来写一个多次更新的例子

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

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

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

 

3.优化

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

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

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

有点抽象

上代码:

  1. class Watcher{
  2. /*
  3. xxx
  4. */
  5. run(){
  6. this.getter()
  7. }
  8. updata() { //三次
  9. //注意:不要数据更新后每次都调用 get 方法 ,get 方法回重新渲染
  10. //缓存
  11. // this.get() //重新渲染
  12. queueWatcher(this)
  13. }
  14. }
  15. let queue = [] // 将需要批量更新的watcher 存放到一个列队中
  16. let has = {}
  17. let pending = false
  18. function queueWatcher(watcher) {
  19. let id = watcher.id // 每个组件都是同一个 watcher
  20. console.log(id) //去重
  21. if (has[id] == null) {//去重
  22. //列队处理
  23. queue.push(watcher)//将wacher 添加到列队中
  24. has[id] = true
  25. //防抖 :用户触发多次,只触发一个 异步,同步
  26. if (!pending) {
  27. // 异步:等待同步代码执行完毕之后,再执行
  28. setTimeout(()=>{
  29. queue.forEach(item=>item.run())
  30. queue = []
  31. has = {}
  32. pending = false
  33. },0)
  34. }
  35. pending = true
  36. }
  37. }

此处,

 

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()块不再执行

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

 

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

 

原文链接:https://www.cnblogs.com/FatTiger4399/p/17775316.html

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

本站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号