当前位置:首页 > 技术文章 > 正文内容

深入 Vue 的 nextTick_vue的nexttick的作用

zonemu2个月前 (08-28)技术文章20

在初学 Vue 时,我们经常会遇到这样的困惑:数据明明已经改了,可页面却没立刻变化;或者手动去获取更新后的 DOM,结果拿到的是旧值。这时候,Vue 官方会推荐我们使用 this.$nextTick()。它到底做了什么?为什么“等一下”就能解决问题?本文尝试用通俗的语言把它的作用和实现原理讲清楚。

一、nextTick 的作用

Vue 的响应式系统有一个核心设计:异步批量更新。

当你连续修改多条数据时,Vue 不会每改一次就立刻重绘页面,而是把这些变更缓存起来,等到本轮事件循环结束后再统一 patch DOM。

这样做的好处显而易见:

  • 减少不必要的重排重绘,性能更好;
  • 避免同一事件循环里多次操作 DOM 带来的闪烁或抖动。

但副作用也随之而来:

在数据改变后的同一轮同步代码里,DOM 仍然是旧的。

因此,如果你需要在视图真正更新完成后执行某些逻辑(比如获取元素新尺寸、手动聚焦、调用依赖于 DOM 的第三方库),就必须等下一轮。

nextTick它的回调会在当前批量更新结束后、浏览器重绘之前被调用。

举个最简单的例子:

二、nextTick 的实现原理

浏览器事件循环里有两类异步队列:

  • 微任务(micro-task):Promise、MutationObserver;执行时机紧跟着当前栈清空后。
  • 宏任务(macro-task):setTimeout、setImmediate、MessageChannel;下一轮事件循环执行。

Vue 的源码中,nextTick 会把所有回调统一放进一个数组,然后用最快且兼容的方式调度:

  1. 如果环境支持 Promise,优先用 Promise.resolve().then() 把回调塞进微任务队列。
  2. 这是现代浏览器最常用、延迟最低的手段。
  3. 如果 Promise 不可用,退而求其次,看是否支持 MutationObserver。
  4. 创建一个文本节点并监听它的变动,当节点改动时触发回调,同样属于微任务。
  5. 如果上述两者都不支持,Vue 会继续降级:
  6. 在 IE 里尝试 setImmediate,它介于宏任务与微任务之间,比 setTimeout 快;
  7. 最后兜底 setTimeout(fn, 0),把回调放到宏任务队列末尾。

整个流程可以概括为一句话:

“能用微任务就不用宏任务,能用更快的宏任务就不用 setTimeout。”

这样既保证了回调尽早执行,又兼顾了老浏览器的兼容性。

总结

  • 作用:等本轮 DOM 批量更新完再跑回调。
  • 原理:先找微任务,再找宏任务,按优先级把回调塞进最合适的异步队列。

相关文章

Vue3开发极简入门(16):祖孙组件间通信之provide&inject

前文说了Vue的组件间关系,有父子、爷孙、其他关系。例如之前的Father、Son是父子关系,App与Son就是爷孙关系。而props的Son,与emits的Son,就是其他关系。前文的props是父...

Gitlab 的使用和代码审查流程介绍

1、先简洁介绍下项目常用的信息-面板统计页面2、用户信息面板3、服务器信息4、项目信息5、重点介绍代码提交审核机制和授权合并机制开发人员推送代码的时候不能直接推送到master,否则就会报错。此时开发...

html5你能把太阳系动态做出来,但是你能把月亮也做出来吗?

需要源码请评论后加前端学习群470593776课题:HTML5加原生js打造一个炫酷动态的太阳系简介:首先对于太阳系各大星球的运转关系,速度等资料,不然弄出来也是被喷的下场, 还有对于逻辑思维,算法的...

最快认知什么才是HTML5广告!(h5广告设计是什么)

H5广告似乎是自UI风靡之后,又一个热度极高的词儿。他是什么?一个字母加一个数字是个什么意思? 为什么如此受欢迎?金色号角会议室,创作事业部赵阳同学就HTML5广告做了详尽生动的分享,带大家一起用手机...

资深程序员是如何工作的?(资深程序员是什么意思)

最近在B站看到一个老外分享的一个资深程序员工作心得,他讲得很好,总结分享一下:1. 不懂就查资料,不需要面面俱到要点:编程不是记忆语言,而是理解模式和查找答案。资深开发者也常谷歌搜索。 重要性:消除“...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩...