第四十二篇 nextTick

         在前面封装swiper组件当中,通过许多种方式方法,其一从mounted初始化过早转到updated后出现初始化重复,再者通过设置key值和使用v-if控制swiper组件,然后通过Vue.diretive自定义指令的方式来封装swiper组件,那么本篇的nextTick其实也是为封装swiper组件遇到的问题提供另外一种解决思路:

nextTick        

        nextTick是什么呢?即在下次DOM更新循环结束之后执行延迟回调;在修改数据之后立即使用这个方法,获取更新后的DOM。


this.$nextTick()

        下面来先通过一个简单的例子来了解nextTick的触发时机;

1. 编写代码

<div id="app"><p>{{myname}}</p></div>
<script>
    new Vue({
        el:'#app',
        data:{
            myname:'321nays'
        },
        mounted(){
            console.log("mounted执行");
            this.myname = 'syan123';
            this.$nextTick(()=>{
                console.log("nextTick执行");
            })
        },
        updated(){
            console.log("updated执行");
        }
    })
</script>

2. 测试效果 

         mounted生命周期之后是updated生命周期,接着才是nextTick的触发时机,nextTick的执行比 updated 晚一些;nextTick 在 updated 修改数据完成立即使用这个方法this.$nextTick()可以获取更新的DOM。

Swiper 初始化问题

        在前面封装swiper组件的时候碰到在mounted生命周期中swiper初始化过早的问题,但在updated 生命周期就有重复执行初始化问题,于是开始了寻找当数据以及准备好了插入DOM节点(父节点)之后再进行初始化工作这样一个时机,那么在现在有这样一个nextTick,它会在updated生命周期数据更新完成之后使用这个this.$nextTick()方法就可以获取到更新之后的DOM,那么只要在this.$nextTick()当中来做swiper的初始化工作不就可以解决swiper所带的问题导致swiper无法轮播。

1 .编写代码

<div id="app">
    <div class="swiper-container mySwiper">
        <div class="swiper-wrapper">
            <div class="swiper-slide" v-for="(item,index) in swiperList" :key="item">
                <img :src="item" alt="">
            </div>
        </div>
        <div class="swiper-pagination"></div>
    </div>
</div>
<script>
new Vue({
        el:'#app',
        data:{
            swiperList:[]
        },
        mounted(){
            // 模拟请求数据
            setTimeout(()=>{
                this.swiperList = [ 
                '图片1.jpg' ,
                '图片2.jpg' ,
                '图片3.jpg' ]; 

                // new Swiper(".author")
                
                this.$nextTick(()=>{
                    new Swiper(".mySwiper",{
                        loop:true,
                        autoplay:true,
                        pagination:{   
                            el:'.swiper-pagination'
                        }
                    })
                })

            },2000)
        }
    })

2. 测试效果 


         通过nextTick解决了swiper轮播初始化过早的问题且swiper能够将图片进行一个正常的轮播;下面来测试如果有数据更新的话是否nextTick会被再次触发,会出现像updated生命周期那样会因为data数据状态的变化而导致swiper重复执行初始化工作;

        通过添加按钮更新数据,在mounted、updated、nextTick触发时执行打印;

<button @click="add"> count : {{count}} </button>
data:{
    count:0
},
methods:{
    add(){
        this.count ++
    }
}

         以上就是关于nextTick的内容了,关于nextTick主要知道如何来使用以及知道下次DOM更新循环结束之后执行延迟回调;在修改数据之后立即使用这个this.$nextTick,获取更新后的DOM。感谢大家的支持!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵魂学者

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值