nextTick 的作用是:在数据修改之后、等待 DOM 更新完成,再执行回调,从而拿到更新后的真实 DOM。Vue 的 DOM 更新是异步批处理的:同一事件循环内多次修改响应式数据,只会触发一次渲染(job 被放进 Promise 微任务队列),这是性能优化的核心。

原理:Vue3 内部维护一个异步任务队列,修改数据触发的渲染 job 会被调度进这个队列,通过 Promise.resolve().then(flushJobs) 在当前同步代码之后、下一个宏任务之前执行。nextTick 本质就是把回调也挂到同一个微任务链上——如果队列正在刷新就排在其后,否则直接新建微任务。它优先用原生 Promise,兜底再用 MutationObserver、setImmediate、setTimeout 等降级方案。

易错点:不要把 nextTick 当"浏览器渲染完成后",它只保证虚拟 DOM 已 patch 到真实 DOM,不保证浏览器绘制完成。追问方向:为什么不用宏任务(避免在渲染前插入太多同步逻辑、保证同一微任务周期完成)、flushJobs 的去重排序、Vue2 中 nextTick 的实现差异。

list.push(newItem)
await nextTick()   // 此时 DOM 已更新
scrollToBottom()