Vue.nextTick()的主要用法是在下次DOM更新循环结束之后执行延迟回调。所以在修改数据之后立即使用这个方法,可以获取更新后的Dom。
// 修改数据
vm.msg = 'Hello'
// DOM 还没有更新
Vue.nextTick(function () {
// DOM 更新了
})
// 作为一个 Promise 使用
Vue.nextTick()
.then(function () {
// DOM 更新了
})
详细使用示例:下面是一个切换元素显示的组件。
<template>
<div>
<button @click="handleClick">点击按钮</button>
<div v-if="show" ref="content">I am an element</div>
</div>
</template>
<script>
export default {
data() {
return {
show: true,
};
},
methods: {
handleClick() {
this.show = !this.show;
console.log(this.show, this.$refs.content);
},
},
};
</script>
点击‘点击按钮’会更改this.show数据,从而控制<div id="content">元素的显示。
在handleClick处理程序内部,this.show记录到控制台的值与记录到控制台的引用不对应。这意味着 DOM 与组件的数据不同步。
如果想捕捉 DOM 刚刚更新的那一刻,就需要使用函数Vue.nextTick(callback)。在新数据更新到达 DOM 后立即执行。
<template>
<div>
<button @click="handleClick">点击按钮</button>
<div v-if="show" ref="content">I am an element</div>
</div>
</template>
<script>
import Vue from "vue";
export default {
data() {
return {
show: true,
};
},
methods: {
handleClick() {
this.show = !this.show;
Vue.nextTick(() => {
console.log(this.show, this.$refs.content);
});
},
},
};
</script>
如上所示,在点击‘点击按钮’时,可以看到this.$refs.content(包含该<div>元素的引用)是undefined或包含一个元素——与this.show值完全对应。
this.$nextTick()是将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法Vue.nextTick一样,不同的是回调的this自动绑定到调用它的实例上。
new Vue({
// ...
methods: {
// ...
example: function () {
// 修改数据
this.message = 'changed'
// DOM 还没有更新
this.$nextTick(function () {
// DOM 现在更新了
// `this` 绑定到当前实例
this.doSomethingElse()
})
}
}
})
还是上面的示例代码,当handleClick()方法中更改this.show数据,立即执行this.$nextTick()以捕捉此更新到达 DOM 的时刻。
<template>
<div>
<button @click="handleClick">点击按钮</button>
<div v-if="show" ref="content">I am an element</div>
</div>
</template>
<script>
export default {
data() {
return {
show: true,
};
},
methods: {
handleClick() {
this.show = !this.show;
this.$nextTick(() => {
console.log(this.show, this.$refs.content);
});
},
},
};
</script>
更改组件的数据时,Vue 会异步更新 DOM。
如果想在组件的数据发生变化后捕捉到 DOM 更新的时刻,需要使用`Vue.nextTick(callback)`or`this.$nextTick(callback)`函数。
它们的单个`callback`参数将在 DOM 更新后立即调用:并且获得与组件数据同步的最新 DOM。
如果不向`Vue.nextTick()`或者`this.$nextTick()`提供回调参数,将返回一个promise,这个promise将在 DOM 更新时被解析。
将其与`async/await`语法一起使用使代码比回调方法更具可读性。
Vue中有个API是nextTick,官方文档是这样介绍作用的:将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。理解这部分内容,有助于理解Vue对页面的渲染过程
异步更新机制使用微任务或宏任务,基于事件循环运行,在 Vue 中对性能起着至关重要的作用,它对重复冗余的 watcher 进行过滤。而 nextTick 根据不同的环境,使用优先级最高的异步任务
定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM,看完是不是有一堆问号?我们从中找出来产生问号的关键词
vue是异步渲染的,当data改变之后,DOM不会立刻被渲染,页面渲染时会将data的修改做整合,多次data修改只会做整合最后一次性渲染出来,这也是异步渲染的原因。只有异步渲染才可以实现整合操作
前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框。由于原生的 autofocus 属性不起作用,需要使用组件库提供的 focus 方法手动手动获取焦点。于是有如下代码
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!