我们这里的解决方案主要是针对动态获取数据的情况,如果您是静态页面就很好解决了,百度走起即可
你是不是有这样的困惑:vue环境下使用swiper出现各种问题,举个栗子:
- swiper实例化后图片资源压根不加载
- 加载了但是没有轮播效果
- 偶尔需要横竖屏切换一下才可以动起来(移动端)...
首先我们看看swiper的实例化原理:
1.找到父级container包裹层
2.给这个父级的尾部逐个添加子元素
3.不要画蛇添足,除了父级元素你可以龟腚(规定)大小以及位置,内部子元素不要乱加定位
4.得到元素后,进行补帧,形成循环轮播效果
5.至于动画,其swiper.css做了大量的transform变形以及动画
接下来我们说说vue的数据获取:
现在vue已经更新了,较多的使用axios进行交互,当然你可以接续使用vue-resource(官方不再更新),不管你的数据库使用的是mysql还是mongodb,我们读取数据时都有一定的时间,所以获取数据都是异步的,说的白一些就是你前台的页面渲染和我的数据获取不是同步的,你做你的我干我的,这就导致一个顺序问题,到底是vue的数据获取在先,还是我swiper实例化在先,我们想要的肯定是数据加载完毕,再开始实例化。
其实说到这里,比较来气,网上好多“程序员”拿vue的钩子函数(生命周期)说这个问题,其实不管你用created还是mounted,都不是解决这个问题的关键所在,其关键点在于异步加载和dom的更新。
具体解决方案:
不管你是在created阶段还是mounted阶段都可以实现最终效果,代码如下
export default { data() { return { banner:[] } }, methods: { _initBanner() { let swiperContainer = this.$refs.swiper; let swiperComp = new Swiper(swiperContainer, { //实例化一个cube轮播 autoplay: 2000, autoplayDisableOnInteraction : false, loop:true, effect: 'cube', cube: { shadow: true, slideShadows: true, shadowOffset:18, shadowScale:0.88 } }) } }, created() { //本例中你可以改为mounted this.$http.get('/api/getbanner').then((res)=>{ this.banner = res.data; //console.log(this.banner); this.$nextTick(() => { //修改数据之后立即使用这个方法,获取更新后的 DOM this._initBanner() }) }) } }
记得在获取数据后实例化swiper组件,并且添加nextTick方法,获取dom的更新状态。