$nexttick的作用_Vue中DOM的异步更新策略以及nextTick机制

本文深入探讨Vue的DOM异步更新策略和nextTick机制。讲解了Vue如何在事件循环的下一个Tick中执行DOM更新,以及nextTick函数在不同实现方式下的作用。重点介绍了Watcher队列、nextTick的实现原理,包括Promise、MutationObserver和setTimeout的优先级,以及Vue在不同版本中的变化。最后,阐述了异步更新视图的必要性和应用场景。
摘要由CSDN通过智能技术生成

本篇文章主要是对Vue中的DOM异步更新策略和nextTick机制的解析,需要读者有一定的Vue使用经验并且熟悉掌握JavaScript事件循环模型。

引入:DOM的异步更新

12c574e8b85e729b0d9905959cc281ab.png

打印的结果是begin, 而不是我们设置的end。这个结果足以说明Vue中DOM的更新并非同步。

在Vue官方文档中是这样说明的:

可能你还没有注意到,Vue异步执行DOM更新。只要观察到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个watcher被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作上非常重要。然后,在下一个的事件循环“tick”中,Vue刷新队列并执行实际 (已去重的) 工作。

简而言之,就是在一个事件循环中发生的所有数据改变都会在下一个事件循环的Tick中来触发视图更新,这也是一个“批处理”的过程。(注意下一个事件循环的Tick有可能是在当前的Tick微任务执行阶段执行,也可能是在下一个Tick执行,主要取决于nextTick函数到底是使用Promise/MutationObserver还是setTimeout)

Watcher队列

在Watcher的源码中,我们发现watcher的update其实是异步的。(注:sync属性默认为false,也就是异步)

7e2e251e34da02ecc336d339762f7c80.png

queueWatcher(this)函数的代码如下:

5a1933fec0c4f28241b628b42012cc3b.png

这段源码有几个需要注意的地方:

1、首先需要知道的是watcher执行update的时候,默认情况下肯定是异步的,它会做以下的两件事:

  • 判断has数组中是否有这个watcher的id
  • 如果有的话是不需要把watcher加入queue中的,否则不做任何处理。

2、这里面的nextTick(flushSchedulerQueue)中,flushScheduleQueue函数的作用主要是执行视图更新的操作,它会把queue中所有的watcher取出来并执行相应的视图更新。

3、核心其实是nextTick函数了,下面我们具体看一下nextTick到底有什么用。

nextTick

nextTick函数其实做了两件事情,一是生成一个timerFunc,把回调作为microTask或macroTask参与到事件循环中来。二是把回调函数放入一个callbacks队列,等待适当的时机执行。(这个时机和timerFunc不同的实现有关)

首先我们先来看它是怎么生成一个timerFunc把回调作为microTask或macroTask的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值