Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。
可以分为三步理解:
第一个 tick:
1.首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及 DOM 。
2. Vue 开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。
第二个 tick
同步任务执行完毕,开始执行异步 watcher 队列的任务,更新 DOM 。Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationsObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。
第三个 tick
即下次 DOM 更新循环结束之后,此时通过 Vue.nextTick 获取到改变后的 DOM 。通过 setTimeout(fn, 0) 也可以同样获取到。
简单总结事件循环:
同步代码执行 -> 查找异步队列,推入执行栈,执行Vue.nextTick[事件循环1] ->查找异步队列,推入执行栈,执行Vue.nextTick[事件循环2]...
(注:需掌握js执行机制)
Vue.js在修改数据后不会立即更新视图,而是在当前事件循环结束后,统一进行视图更新。这个过程涉及同步任务、异步队列和DOM更新。在数据变更时,Vue会启动异步队列,避免频繁DOM操作。在下一个事件循环,Vue利用原生API或setTimeout(fn,0)更新DOM。最后,通过Vue.nextTick可在DOM更新后执行回调。

2828

被折叠的 条评论
为什么被折叠?



