nextTick原理
NextTick
官方定义:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
我们可以理解成,Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新。
1 | {{num}} |
如果没有 nextTick 更新机制,那么 num 每次更新值都会触发视图更新(上面这段代码也就是会更新10万次视图),有了nextTick机制,只需要更新一次,所以nextTick本质是一种优化策略
使用
1 | // 类型 |
你可以传递一个回调函数作为参数,或者 await 返回的 Promise。
1 | <script setup> |
原理
Vue在更新dom时是异步执行的。只要监听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个watcher被多次触发,只会被推入到队列中一次。这种在缓存时去重对于避免不必要的计算和dom操作是非常重要的。nextTick方法会在队列中加入一个回调函数,确保该函数在前面的dom操作完成后才调用。
nextTick 主要使用了宏任务和微任务。根据执行环境分别尝试采用:
PromiseMutationObserver:微任务,创建并返回一个新的MutationObserver它会在指定的 DOM 发生变化时被调用setImmediate:宏任务,可以用来替代setTimeout(fn, 0)- 如果以上都不行则采用
setTimeout
过程:
- 把回调函数放入callbacks等待执行
- 根据执行环境,将执行函数放到微任务或者宏任务中
- 事件循环到了微任务或者宏任务,执行函数依次执行callbacks中的回调
- 本文标题:nextTick原理
- 本文作者:灵感胜于汗水
- 创建时间:2022-10-30 16:33:01
- 本文链接:https://cjhsyc.github.io/2022/10/30/nextTick原理/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!