-----本文作者:Villin-----
$nextTick()用法:
this.$nextTick(),在下次 DOM 更新循环结束之后执行延迟回调。
什么意思?
来看一个简单的小例子,感受一下 $nextTick() 是干嘛的:
两个div,一个button按钮
<div ref="onediv">{{ onediv }}</div> 第一个div
<div>{{ twodiv }}</div> 第二个div
<button @click="handleClick">点击我将000改成456</button>
将一个div默认值设为123,第二个默认值设为000
data() {
return {
onediv: "123",
twodiv: "000"
};
}
当我点击按钮的时候,将第一个div的值123改变成456,同时获取到div改变后的值456,赋给第二个div。也就是说结果两个div都应该为456.
methods: {
handleClick() {
this.onediv = "456";
this.twodiv = this.$refs.onediv.innerHTML; // 通过原生$ref获取到第一个div改变后的值,然后赋给第二给div
console.log(this.twodiv);
}
}
我们点击后查看
我们发现,第一个div确实是改变了,但是第二个div获取到的值却是第一个div之前的值,因为Dom还没有更新循环完,所以它的值还是123。回过头看一下 $nextTick 的用法介绍,就知道了,所以这个时候我们想获取到div更改后的值,就需要用到 $nextTick
。我们用 $nextTick 将它包裹起来,等到Dom节点渲染循环完,我们再取值,再赋值。
methods: {
handleClick() {
this.onediv = "456";
this.$nextTick(() => {
this.twodiv = this.$refs.onediv.innerHTML; // 通过原生$ref获取到第一个div改变后的值,然后赋给第二给div
console.log(this.twodiv);
});
}
}
其实this.$nextTick用法到这里也就完了,我们也可以按照nextTick的中文意思(节点的下一步)来真正理解它的含义了,也就是等到Dom节点结束后再执行下一步的操作。那么我再多说一些:
刚才的案例,同时也说明了一个问题,Vue 在更新 DOM 时是异步执行的。所以this.$nextTick是处理异步的一个回调函数,它返回的是一个promise对象,那么我们这个代码也可以用promise来改写,我们可以用 ES7 async/await 语法完成相同的事情:
methods: {
async handleClick() {
this.onediv = "456";
await this.$nextTick(); // await 等待返回值后,再执行下面的事情。
this.twodiv = this.$refs.onediv.innerHTML; // 通过原生$ref获取到第一个div改变后的值,然后赋给第二给div
console.log(this.twodiv);
}
}
结果也是一样的。