浅谈Vue与swiper轮播图框架结合小案例
Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。
Swiper能实现触屏焦点图、触屏Tab切换、触屏多图切换等常用效果。
那么Vue与swiper的结合,就显的至关重要了,下面简单介绍一下Vue与swiper结合使用的小案例
首先,在引入了各个js与css文件以后,写入页面结构
<div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide">Slide 1</div> <div class="swiper-slide">Slide 2</div> <div class="swiper-slide">Slide 3</div> </div> </div>
在script标签中对swiper进行实例
var mySwiper = new Swiper ('.swiper-container', { loop: true, // 循环模式选项 })
这时,一个简单的swiper轮播图小案例就实现了。
此时,我们可以通过定义一个Vue实例,来实现swiper内部轮播页的遍历。
new Vue({ el:"#app", data:{ dataList:[1,2,3] }, mounted(){ new Swiper('.swiper-container',{ loop:true }) } })
将页面结构的类名为swiper-slide的标签通过v-for指令,来进行遍历
<div class="swiper-slide" v-for="data in dataList" :key='index'>{{data}}</div>
因为在以上正常实例化的过程当中,没有进行一个ajax的异步请求操作,所以我们才可以直接在生命周期的mounted钩子函数当中直接进行实例化,因为此时已经出现了真实dom树。
但是我们在正常的项目交互当中,肯定是需要请求后端发送过来的数据,这就需要在created钩子函数中进行异步数据请求,此时,如果我们再在mounted中进行swiper的实例化,那么问题就来了。
在这个地方,我们用setTimeout延时器的方式,来模拟异步请求数据,比如以下代码:
new Vue({ el:"#app", data:{ dataList:[] }, created(){ setTimeout(()=>{ this.dataList = [1,2,3] }) }, mounted(){ new Swiper('.swiper-container',{ loop:true }) } })
此时,我们会很明显的发现,运行出来的swiper轮播图,有很大的bug,它无法正常使用了,这是为什么呢?
这是因为我们通过延时器改变Vue自身数据的时候,会再进行一次虚拟dom树比对,然后进行diff算法,渲染成真实dom树这一个流程,此时,我们mounted钩子函数中的实例早已经完成了, 所以造成了我们的swiper轮播图无法正常使用了
那此时我们是不是该想,什么时候可以执行这个实例化呢,那么答案肯定是updated钩子函数中
因为updated钩子函数中,数据已经挂载完毕,数据也已经改变了,并且已经生成了新的真实dom树,所以,在这个钩子函数中,我们页面中所有真实dom都已经存在了,在这里面进行我们的实例化,就不会出现上面我们所描述的问题了。
updated(){ new Swiper(".swiper-container",{ loop:true }) }
这是初步解决异步请求数据,导致实例化位置需要改变的一个方法,还有其他的比较好用的方法,欢迎大家一起来讨论学习