一、Vue的更新机制
在vue中,当响应式数据发生变化后,会触发dom的自动更新。但这个更新并不是同步的,而是在同步任务结束后,将更新视图的任务放入微任务队列,也就是异步任务队列中进行。
这样的好处是可以减少不必要的消耗,避免在一次事件循环中有大量任务时造成的不必要重排和重绘,所以一个事件循环的同步任务中,不管数据变化了多少次,都只会更新一次。
二、什么是nextTick
nextTick是 Vue.js 中的一个全局 API,在JS的事件循环中它将回调函数放进微任务队列。DOM 的更新在同步任务队列清空后,且在微任务队列中的所有任务执行之前发生,这意味着在微任务队列中的dom是已更新的,所以nextTikc可以在dom更新后进行一些操作。
三、在什么时候用nextTick
- 需要在DOM 更新后执行操作:Vue.js 异步执行 DOM 更新。这意味着当你修改了数据,DOM 不会立即更新,而是等到下一次事件循环。nextTick允许你在 DOM 更新后立即执行某些操作。例如,你可能想在数据更改后获取新的 DOM 元素尺寸或位置。
- 确保视图与数据同步:在某些情况下,你可能需要确保视图已经与底层数据完全同步。使用nextTick可以确保在继续执行代码之前,DOM 已经根据最新的数据进行了更新。
四、VUE2与VUE3中使用nextTick
vue2:
this.$nextTick(function () {
// DOM 现在已经更新
})
vue3:
import { nextTick } from 'vue'
nextTick(() => {
// DOM 现在已经更新
})