一、什么是nextTick
官网定义
在下次 DOM 更新循环结束之后执行延迟回调。
在修改数据之后立即使用这个方法,获取更新后的DOM
可以理解成,Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新。
而nextTick中可以在Vue更新后立刻获取到最新值
二、nextTick的作用
示例:
{{num}}
for(let i=0; i<100000; i++){
num = i
}
如果没有 nextTick 更新机制,那么 num 每次更新值都会触发视图更新(上面这段代码也就是会更新10万次视图),有了nextTick机制,只需要更新一次,所以nextTick本质是一种优化策略
三、nextTick的使用方式
第一个参数为:加入异步任务队列的回调函数(可以获取最近的DOM结构)
第二个参数为:执行函数上下文
this.$nextTick(()=>{
// 在这里获取dom更新后的值
})
四、nextTick的使用场景
如果想要在修改数据后立刻得到更新后的DOM结构,可以使用Vue.nextTick()
1、在created生命同期里,想操作渲染后的视图(但还不存在)。 因在created执行时,DOM并未进行任何渲染,因此拿不到。 如非要等,可以在nextTick的回调函数中去操作。
created(){
this.$nextTick(()=>{
在此操作子组件更新后的dom
})
}
2、在mounted生命同期表示所有的DOM都已挂载并渲染完成,在此钩子函数操作DOM几乎没有问题,但mounted可并没有承诺所有的子组件都一起被挂载,如果等所有整个视图全部渲染完毕也可以考虑使用nextTick代替mounted比较保险。
mounted(){
this.$nextTick(()=>{
在此操作子组件更新后的dom
})
}
3、在使用第三方插件时,希望在Vue生成的某些DOM动态变化时去重新调用该插件也可以使用。
mounted(){
this.$nextTick(()=>{
this.Toast("xxx")c
})
}