经过踩坑,打算在nuxt中使用vue-awesome-swiper,本来打算直接用cdn在页面的head中引入swiper脚本及css文件,然后像在vue单页项目使用一样,但是,本地运行一刷新页面,swiper就失去了作用,不会滑动,自定义的导航点也没有,(自己又找不到真正的原因)只好用网上提到最多的vue-awesome-swiper来继续尝试使用。
1、首先,安装
npm install vue-awesome-swiper --save
有个报错:
大致意识是 需要swiper5.2.0版本作为依赖
那就再装个swiper
npm install swiper --save
2、在plugins下新建vue-swiper.js文件
import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper'
Vue.use(VueAwesomeSwiper)
3.在nuxt.config.js中配置:
css:[ { src: "swiper/css/swiper.css" }
], plugins:[ { src: "~/plugins/vue-swiper.js", ssr: false }, ]
在components中创建一个swiperCpt.vue组件
<template> <div v-swiper:mySwiper="swiperOption" class="swiperWrap"> <div class="swiper-wrapper"> <div class="swiper-slide" v-for="banner in banners"> <img :src="banner.src"> </div> </div> <div class="swiper-pagination swiper-pagination-bullets"></div> </div> </template> <script> export default { data(){ return{ banners:[ {src:"http://kexiepingtaieposter.hoohui.cn/paper_file/15908353622331590835195(1).png",link:""}, {src:"http://kexiepingtaieposter.hoohui.cn/paper_file/15908353884901590835256(1).jpg",link:""}, ], swiperOption: { loop: true, slidesPerView: 'auto', centeredSlides: true, spaceBetween: 30, pagination: { el: '.swiper-pagination', dynamicBullets: true }, on: { slideChange() { console.log('onSlideChangeEnd', this); }, tap() { console.log('onTap', this); } } } } }, mounted(){ } } </script> <style lang="scss" scoped> .swiperWrap{ border:1px solid red; .swiper-slide{ border:1px solid green; img{ width:100%; height:100%; } } } </style>
在页面中使用:
import swiperCpt from '~/components/swiperCpt.vue';
components: {
swiperCpt
},
<swiperCpt></swiperCpt>
再封装个组件,banner由外部传入
swiperCpt.vue
<template> <div> <div v-if="initStatus" v-swiper:mySwiper="swiperOption" :class="cusClass+' swiperWrap swiperBox '+ swpName" > <div class="swiper-wrapper"> <div class="swiper-slide" v-for="banner in list"> <a v-if="banner.link" :href="banner.link" target="_blank"> <img :src="banner.src"> </a> <img v-else :src="banner.src"> </div> </div> <div class="swiper-pagination swiper-pagination-bullets"></div> </div> </div> </template> <script> export default { props:{ list:{ //banner数组 type:Array, default:function(){ return [] } }, cusClass:{ //自定义类名 type:String, default:'' }, loop:{ //是否循环 type:Boolean, default:true }, delay:{ //间隔时间 type:Number, default:3000 }, spaceBetween:{ //两个恶轮播的间隔 type:Number, default:0 }, slidesPerView:{ //一页显示几个 type:Number, default:1 }, paginationType:{ //导航点类型 // 'bullets' 圆点(默认) // 'fraction' 分式 // 'progressbar' 进度条 // 'custom' 自定义 type:String, default:'' } }, data(){ return{ initStatus:false,//初始化状态 swpName:this.roundString(),//swiper的类名 swiperOption: {},//swiper参数 } }, mounted(){ let self = this; this.$nextTick(()=>{ this.swiperOption={ loop: self.loop, centeredSlides: true, slidesPerView: self.slidesPerView,//一页显示几个 spaceBetween: self.spaceBetween,//间隔 autoplay:{//自动轮播 delay: self.delay, disableOnInteraction: false,//操作swiper后 自动轮播不会停止 }, pagination: { el: '.swiper-pagination', dynamicBullets: true, clickable: true, type:self.paginationType?self.paginationType:'bullets' }, on: { slideChange() { console.log('onSlideChangeEnd', this); }, tap() { console.log('onTap', this); } } } this.initStatus = true;//渲染swiper }) }, methods:{ roundString() { //生成随机字符串 let str = ""; let chars = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; chars.forEach(() => { str += chars[Math.ceil(Math.random()*25)] }); return str; } } } </script> <style lang="scss" scoped> .swiperWrap{ .swiper-slide{ img{ 100%; height:100%; } } } </style>
在页面中使用:
banners:[ {src:"http://kexiepingtaieposter.hoohui.cn/paper_file/15908353622331590835195(1).png",link:"http://www.baidu.com"}, {src:"http://kexiepingtaieposter.hoohui.cn/paper_file/15908353884901590835256(1).jpg",link:""}, ],
import swiperCpt from '~/components/swiperCpt.vue';
components: { swiperCpt},
<swiperCpt :list="banners"></swiperCpt>
。