Vue - vue.nextTick()
2019-11-04 本文已影响0人
ElricTang
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
一. 意义:
- 修改数据后,并不是马上就渲染到DOM上面的,vue还需要进行一系列的操作(通知watcher更新等等)。
- vue.nextTick()保证了回调在数据更新好后执行。
- 我们不知道什么时候完成这些操作,vue.nextTick()出现后也就不用管什么时候完成,只需要把完成后要干的事作为回调传入vue.nextTick()就行。
二. 使用方法:
1. 传入回调
// 修改数据
vm.msg = 'Hello'
// DOM 还没有更新
Vue.nextTick(function () {
// DOM 更新了
})
2. 作为一个 Promise 使用 (2.1.0 起新增 )
// 修改数据
vm.msg = 'Hello'
Vue.nextTick()
.then(function () {
// DOM 更新了
})
三. 使用场景:
1. 在生命周期钩子函数created()中使用
- 因为created阶段DOM尚未渲染,无法执行DOM操作。使用vue.nextTick()将回调延迟到DOM渲染完成后自动执行。
<body>
<div id='app'>
<span ref="msg"></span>
</div>
<script>
var vm=new Vue({
el:'#app',
data:{
},
created(){
this.$nextTick(()=>{
this.$refs.msg.innerText = 'hello world';
})
}
})
</script>
</body>
2. 更新数据后想获取新内容
- 更新后直接获取DOM
<body>
<div id='app'>
<span id='target'>{{msg}}</span>
<button @click="change">change value</button>
</div>
<script>
var vm=new Vue({
el:'#app',
data:{
msg:'hello world'
},
methods:{
change(){
this.msg = 'value has been changed';
let target = document.getElementById('target');
console.log(target.innerText);
}
}
})
</script>
</body>
- 更新后在nextTick()回调中获取DOM
methods:{
change(){
this.msg = 'value has been changed';
this.$nextTick(()=>{
let target = document.getElementById('target');
console.log(target.innerText);
})
}
}
3. 确保子组件加载完成
- mounted阶段不会承诺所有的子组件也都一起被挂载。使用vue.nextTick()进行子组件相关操作。