vue nexttrick实现
Vue.nextTick 的实现原理
Vue.nextTick 是 Vue.js 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。这个方法常用于处理 DOM 更新后的操作。
核心实现机制
Vue.nextTick 的实现基于 JavaScript 的事件循环机制,优先使用微任务(microtask)来实现异步延迟。具体实现会根据运行环境选择最优的异步 API:
- Promise(首选)
- MutationObserver(备用)
- setImmediate(IE 和 Node.js 环境)
- setTimeout(降级方案)
基本用法示例
Vue.nextTick(() => {
// DOM 更新后执行的操作
console.log('DOM updated')
})
或者使用 Promise 风格的调用:

Vue.nextTick().then(() => {
// DOM 更新后执行的操作
})
实现源码分析
Vue 内部维护了一个回调队列,nextTick 将回调函数推入这个队列。当执行环境准备就绪时,会依次执行队列中的所有回调。
const callbacks = []
let pending = false
function flushCallbacks() {
pending = false
const copies = callbacks.slice(0)
callbacks.length = 0
for (let i = 0; i < copies.length; i++) {
copies[i]()
}
}
function nextTick(cb, ctx) {
let _resolve
callbacks.push(() => {
if (cb) {
try {
cb.call(ctx)
} catch (e) {
handleError(e, ctx, 'nextTick')
}
} else if (_resolve) {
_resolve(ctx)
}
})
if (!pending) {
pending = true
timerFunc()
}
if (!cb && typeof Promise !== 'undefined') {
return new Promise(resolve => {
_resolve = resolve
})
}
}
实际应用场景
-
在数据变化后获取更新后的 DOM

this.message = 'updated' Vue.nextTick(() => { console.log(this.$el.textContent) // 获取更新后的内容 }) -
在组件渲染完成后执行操作
Vue.nextTick(() => { // 组件渲染完成后的操作 }) -
在过渡动画结束后执行回调
this.show = false Vue.nextTick(() => { // 过渡动画结束后的操作 })
性能优化提示
过度使用 nextTick 可能导致性能问题,应当合理使用。在大多数情况下,Vue 的响应式系统会自动处理 DOM 更新,不需要手动调用 nextTick。






