[vue]$nextTick

如果在修改数据之后,需要立即获取被修改的元素,需要用到nextTick才可以获取到更新后的dom。

<template>
  <div id="app">
    <span ref="name">{{ name }}</span>
    <button type="button" @click="change">改变</button>
  </div>
</template>
<script>
export default {
  name: 'App',
  data() {
    return {
      list: [1,2,3],
      name: 'tom'
    }
  },
  methods: {
    change() {
      this.name = 'lucy';
      console.log(this.$refs.name.innerHTML, 'dom未更新'); // 输出tom
      this.$nextTick(function (){
        console.log(this.$refs.name.innerHTML, 'dom已更新'); // 输出tom
      });
    }
  }
}
</script>

原因就在于,vue更新dom时,并不是同步更新的,而是异步更新。
js遇到异步时,会将其放入事件队列继续执行主线程的任务,当主线程执行完毕时,才会去事件队列执行异步任务。所以呢,我们直接输出的话,获取到的就是未更新数据。


  • 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。
  • 在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。
  • 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

vue还提供了Promise的写法,既:this.$nextTick().then()。

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

推荐阅读更多精彩内容

  • 找了一个实习,去公司做数据的可视化,就是用iview-admin,Echarts做一下展示。中间遇到了一个问题数据...
    小白小白啦阅读 12,764评论 1 8
  • 什么是Vue.nextTick()?? 定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使...
    w晚风阅读 4,657评论 0 20
  • 实例生命周期: beforeCreate:在实例初始化之后,数据观测data observer(props、dat...
    隔壁老王z阅读 37,077评论 0 29
  • 什么是Vue.nextTick() 官方文档解释如下: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之...
    公子七阅读 3,047评论 0 2
  • 定义:在下次Dom更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的Dom。 (所以放在v...
    焦迈奇阅读 5,027评论 0 3