this.$nextTick

时间:2025-01-18 16:09:25

(callback),当数据发生变化,更新后执行回调。
this.$nextTick(callback),当dom发生变化,更新后执行的回调。

在以下两个情况下需要用到()

生命周期的created()钩子函数进行的DOM操作一定要放在()的回调函数中,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

2.在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进()的回调函数中。在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

//改变数据

 = 'changed'

//想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新

(this.$) // 并不会得到'changed'

//这样可以,nextTick里面的代码会在DOM更新后执行

(function(){

(this.$) //可以得到'changed'

})

比如 vue的吸顶效果

<template>
  <div class="hello" ref="hello">
    <div class="header">我是头部</div>
    <ul class="nav" :class="{'is_fixed' : isFixed}" >
      <li @click="returnL">tab1</li>
      <li @click="returnL">tab2</li>
      <li @click="returnL">tab3</li>
    </ul>
    <component :is="repMsg"></component>
  </div>
</template>

<script>
import Tab1 from '@/components/tab1'
import Tab2 from '@/components/tab2'
import Tab3 from '@/components/tab3'
export default {
  name: 'HelloWorld',
  components: {
    Tab1,
    Tab2,
    Tab3
  },
  computed: {
    repMsg: function () {
      return []
    }
  },
  data () {
    return {
      msg: ['Tab1', 'Tab2', 'Tab3'],
      index: 0,
      isFixed: false,
      offsetTop:0
    }
  },
  mounted: function () {
    ('scroll', )
    this.$nextTick( () => {
       = ('#boxFixed').offsetTop
    })
  },
  methods: {
    returnL: function () {
       = (++) % 3
    },
    initHeight () {
      var scrollTop =  ||  || 
       = scrollTop >  ? true : false;
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  *{
    margin: 0;
    padding: 0;
  }
.header{
  width: 100%;
  height: 300px;
  line-height: 300px;
  border: 1px solid #ccc;
}
  ul{
    overflow: hidden;
    display: flex;
    justify-content:center;
    top: 0;
  }
  li{
    list-style: none;
    float: left;
    width: 100px;
    height: 50px;
    line-height: 50px;
    border: 1px solid #ccc;
    cursor: pointer;
  }
  .is_fixed {
    position: fixed;
    top: 0;
    left: 50%;
    margin-left: -153px;
    z-index: 999;
  }
</style>