首先在 Vue 中,DOM 的更新是异步的,操作真实的 DOM 是极其昂贵的。频繁地触发浏览器的**重排(Reflow)和重绘(Repaint)**会导致明显的卡顿
『同步收集依赖、异步刷新队列』的策略,以 JS 执行栈清空为界限进行 DOM 派发。一旦遇到异步边界(Async Boundary),则会自动触发当前生命周期的微任务刷新
当你修改了响应式数据(例如 count.value++),Vue 并不会立即去更新 DOM 节点,而是:
如果你在修改数据后立即尝试获取 DOM 的内容,拿到的将是旧数据,nextTick 就是为了可以在“DOM 更新完成”这个时机点执行回调
| DOM 更新操作本身是什么? | 一个微任务 |
| 这个微任务是谁创建的? | Vue 内部自动创建的(用 nextTick + Promise) |
需要手动写 Promise.then 才能触发吗? | 不需要,Vue 会自动创建并调度 |
| 同步代码结束后这个微任务会执行吗? | 会,事件循环会自动清空微任务队列 |
| 如果没有任何数据修改,会有这个微任务吗? | 不会,没有数据修改就不会创建 |
Vue 2 的内部实现是一个典型的**优先微任务(Microtask)**的降级方案。为了确保回调尽可能早地执行,它会按以下顺序探测浏览器支持的异步 API:
Vue 3 抛弃了复杂的降级逻辑,直接使用 Promise
原因: Vue 3 针对的是现代浏览器,这些环境百分之百支持 Promise
