this.$nextTick()

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

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

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

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

//改变数据

this.message = 'changed'

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

console.log(this.$el.textContent) // 并不会得到'changed'

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

Vue.nextTick(function(){

console.log(this.$el.textContent) //可以得到'changed'

})

比如 vue的吸顶效果

<template>
  <div class="hello" ref="hello">
    <div class="header">我是头部</div>
    <ul class="nav" :class="{'is_fixed' : isFixed}" id="boxFixed">
      <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 this.msg[this.index]
    }
  },
  data () {
    return {
      msg: ['Tab1', 'Tab2', 'Tab3'],
      index: 0,
      isFixed: false,
      offsetTop:0
    }
  },
  mounted: function () {
    window.addEventListener('scroll', this.initHeight)
    this.$nextTick( () => {
      this.offsetTop = document.querySelector('#boxFixed').offsetTop
    })
  },
  methods: {
    returnL: function () {
      this.index = (++this.index) % 3
    },
    initHeight () {
      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
      this.isFixed = scrollTop > this.offsetTop ? 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>
  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值