Vue 中$nextTick

语法

// 回调函数中 this 为当前组件 VueComponent
this.$nextTick(回调函数)

作用

在下一次 DOM 更新结束后执行其指定的回调。
这样说其实有点难以理解,DOM更新结束后是什么时候?难道数据变了,DOM没变吗?
先上代码
<template>
  <div id="app">
    <h1 ref="test">{{ a }}</h1>
    <button @click="refresh ()">点我+</button>
  </div>
</template>
<script>
export default {
  name: 'App',
  data(){
    return {
      a:1
    }
  },
  methods:{
    refresh(){
      this.a++
      console.log("before:" + this.$refs.test.innerHTML);  // 1
      this.$nextTick(()=>{
        console.log("$nextTick:" + this.$refs.test.innerHTML); // 2
      })
      console.log("after:" + this.$refs.test.innerHTML); // 1
    }
  },
}
</script>

 

 上图进行了一个点击按钮由数字由 1 => 2 的过程,可以看出,确实是数据变了,DOM还没变。

根据顺序,首先可以判断出这是一个异步的过程,根据深入响应式原理 - vue.js,Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM,API 文档中官方示例如下:

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
    return {
      message: '未更新'
    }
  },
  methods: {
    updateMessage: function () {
      this.message = '已更新'
      console.log(this.$el.textContent) // => '未更新'
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => '已更新'
      })
    }
  }
})

 

posted @ 2022-12-23 20:55  邢韬  阅读(95)  评论(0编辑  收藏  举报