当前位置:首页 > VUE

vue $nexttick如何实现的

2026-01-21 05:43:57VUE

Vue $nextTick 的实现原理

Vue 的 $nextTick 方法用于在 DOM 更新完成后执行回调函数。其核心实现依赖于 JavaScript 的事件循环机制和微任务/宏任务的调度。

基于微任务的异步队列

Vue 在内部维护一个回调队列,$nextTick 会将回调函数推入这个队列。Vue 会根据当前环境选择最优的异步调度方式:

  • Promise(首选):现代浏览器支持的原生微任务 API,优先级最高。

    vue $nexttick如何实现的

    if (typeof Promise !== 'undefined') {
      const p = Promise.resolve()
      timerFunc = () => p.then(flushCallbacks)
    }
  • MutationObserver:作为 Promise 的降级方案,同样是微任务。

    let counter = 1
    const observer = new MutationObserver(flushCallbacks)
    const textNode = document.createTextNode(String(counter))
    observer.observe(textNode, { characterData: true })
    timerFunc = () => {
      counter = (counter + 1) % 2
      textNode.data = String(counter)
    }
  • setImmediate:Node.js 环境的高效宏任务。

    vue $nexttick如何实现的

    if (typeof setImmediate !== 'undefined') {
      timerFunc = () => setImmediate(flushCallbacks)
    }
  • setTimeout:最终的兼容性兜底方案。

    timerFunc = () => setTimeout(flushCallbacks, 0)

执行流程

  1. 回调收集:调用 $nextTick(callback) 时,回调被推入 callbacks 数组。
  2. 异步触发:通过 timerFunc 调度 flushCallbacks 执行。
  3. 队列处理flushCallbacks 会复制当前队列并依次执行所有回调,同时清空队列。

源码关键逻辑

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) {
  callbacks.push(() => {
    if (cb) cb.call(ctx)
  })
  if (!pending) {
    pending = true
    timerFunc()
  }
}

与数据更新的关系

当响应式数据变化时,Vue 的更新也是通过 nextTick 实现的异步队列:

  • 数据变更触发 dep.notify()
  • watcher.update() 将渲染 watcher 加入队列
  • nextTick(flushSchedulerQueue) 确保更新在下次事件循环执行

这种设计保证了:

  • 同一事件循环内的多次数据变更只会触发一次渲染
  • 在回调中能获取更新后的 DOM
  • 避免不必要的重复计算

标签: 如何实现vue
分享给朋友:

相关文章

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:用…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue模版实现

vue模版实现

Vue 模板实现方法 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将 DOM 绑定至底层 Vue 实例的数据。以下是几种常见的 Vue 模板实现方式: 单文件组件(SFC) 使用 .v…

vue 实现原理

vue 实现原理

Vue 实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现原理的核心要点: 响应式系统 Vu…