nextTick 方法 | Vue

3,799 阅读1分钟

nextTick 方法

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新

简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

Vuedata 的数据变化是同步的,更新完就能拿到;但是 dom 的更新是异步的,需要用nextTick 去即时获取

说白了就是因为 Vue 是异步执行 DOM 更新的,想立即操作更新后的 DOM 就需要使用 $nextTick

nextTick

nextTick 用途

createdmounted 阶段,如果需要操作渲染后的视图,也要使用 nextTick 方法。

官方文档说明:

注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted

mounted: function () {
  this.$nextTick(function () {
    // Code that will run only after the
    // entire view has been rendered
  })
}

其他应用场景

  • 点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。
showsou(){
  this.showit = true //修改 v-show
  document.getElementById("keywords").focus()  
    //在第一个 tick 里,获取不到输入框,自然也获取不到焦点
}

修改为:

showsou(){
  this.showit = true
  this.$nextTick(function () {
    // DOM 更新了
    document.getElementById("keywords").focus()
  })
}
  • 点击获取元素宽度。
<div id="app">
    <p ref="myWidth" v-if="showMe">{{ message }}</p>
    <button @click="getMyWidth">获取p元素宽度</button>
</div>

getMyWidth() {
    this.showMe = true;
    //this.message = this.$refs.myWidth.offsetWidth;
    //报错 TypeError: this.$refs.myWidth is undefined
    this.$nextTick(()=>{
        //dom元素更新后执行,此时能拿到p元素的属性
        this.message = this.$refs.myWidth.offsetWidth;
  })
}