Vue —— this.$nextTick()的使用

  • 原理

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

  • 用法

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用this.$nextTick(),然后等待 DOM 更新。


<template>
  <div>
    <p ref="msgRef">{{msg}}</p>
    <button @click="handle">更新</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: '原始'
    }
  },
created () {
    console.log("created:" + this.$refs.msgRef.innerHTML); // 这个里会报错,此时没有innerHTML,后面会不执行
    this.$nextTick(() => {
        console.log("created nextTick:" + this.$refs.msgRef.innerHTML);
    })
  },
methods: {
    handle() {
      this.msg = '新值';
      console.log(this.$refs.msgRef.innerHTML);
      this.$nextTick(() => {
        console.log(this.$refs.msgRef.innerHTML);
      })
    }
  }
</script>

结果

从打印的结果可以看出,因为在created()钩子函数的时候dom还没有渲染,所以会报错,created()里后面的就不会执行。

    1. 把console.log("created:" + this.$refs.msgRef.innerHTML);注释


从打印结果可以看到在created()中使用this.$nextTick()可以获取到值。

    1. 点击按钮


可以看到直接打印的是之前的值,使用this.$nextTick()打印的是更新后的值。

  • 使用场景
    • 在created()中进行操作的话一定要使用this.$nextTick(),
    • 在根据数据变化进行DOM操作时使用this.$nextTick()

总结

  • 在created()中使用this.$nextTick(),相当于在mounted()中进行操作,因为在created()时DOM还没有渲染
  • 在项目中会经常遇到数据更新但是视图没有更新,这种情况就需要用到this.$set(),可以查看我的另一篇文章传送门
  • 还有会根据数据变化对DOM进行操作获取某些数据,此时就发生获取不到更新后的值的情况,此时就可以使用this.$nextTick()

以上就是对this.$nextTick()简单的使用和理解。

\color{pink}{欢迎交流讨论}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容