vue中二次封装swiper

612 阅读1分钟

swiper版本:6.4.5
npm i swiper@6

代码如下

<!-- 新建vue文件内容为:-->
<template>
  <!-- Slider main container -->
  <div class="swiper-container" ref="swiper">
    <!-- Additional required wrapper -->
    <div class="swiper-wrapper">
      <!-- Slides -->
      <div class="swiper-slide" v-for="carousel of carouselList"
           :key="carousel.id">
        <!--  图片懒加载和swiper一起使用可能会出现一个bug 即渲染出空白图,下面是解决方案      -->
        <img :src="carousel.imageUrl" v-if="index==0||index===(carouselList.length-1)">
        <img v-lazy.container="carousel.imageUrl" alt="" v-else>
      </div>
    </div>
    <!-- If we need pagination -->
    <div class="swiper-pagination"></div>

    <!-- If we need navigation buttons -->
    <div class="swiper-button-prev"></div>
    <div class="swiper-button-next"></div>

    <!-- If we need scrollbar -->
    <!--    <div class="swiper-scrollbar"></div>-->
  </div>
</template>

<script>
// 轮播图组件
// import Swiper JS
// Swiper6默认只有核心轮播图功能,其他功能没有
import {Swiper, Pagination, Navigation, Autoplay} from 'swiper';
// import Swiper styles
import 'swiper/swiper-bundle.css';
// 要使用其他功能,需要先加载
Swiper.use([Navigation, Pagination, Autoplay]);
export default {
  name: "Carousel",
  props: {
    // 轮播图数据
    carouselList: {
      type: Array,
      required: true   // 必须有
    }
  },
  // 使用侦听器,一旦数据发生变化就触发函数
  watch: {
    // 侦听该数据
    carouselList: {
      handler() {
        this.$nextTick(() => {
          //初始化swiper
          this.initSwiper();
        });
      },
      immediate: true   // 立即调用
    }
  },
  methods: {
    // 初始化swiper函数
    initSwiper() {
      // 使用 this.$refs.swiper 取代 .swiper-container类名 否则有可能出现轮播出现空白的问题
      // 使用 this.$refs.swiper 才能保证轮播图组件使用的自己的swiper,
      this.swiper = new Swiper(this.$refs.swiper, {
        loop: true, // 无缝轮播
        autoplay: {   // 自动轮播
          delay: 2000, // 轮播间隔时间
          disableOnInteraction: false, // 当用户点击下一页时,仍会开启自动轮播
        },
        pagination: {   // 启用分页器 也就是小圆点
          el: '.swiper-pagination',
          clickable: true   // 点击小圆点切换图片
        },
        navigation: {   // 启用前进后退按钮
          nextEl: ".swiper-button-next",
          prevEl: ".swiper-button-prev",
        }
      })
      //鼠标覆盖停止自动切换
      this.swiper.el.onmouseover = function () {
        this.swiper.autoplay.stop();
      }
      //鼠标离开开始自动切换
      this.swiper.el.onmouseout = function () {
        this.swiper.autoplay.start();
      }
    }
  },
}
</script>

组件中使用轮播图组件

// 路径别名 在vue.config.js中配置
// 局部使用
import Carousel from "@comps/Carousel";
components:{
    // 注册组件
    Carousel
}
// 全局注册组件在main.js中
Vue.component('Carousel', Carousel)
// 在要使用轮播图的组件中直接使用<Carousel/>
// 使用
<div>
// carouselList=轮播图数据 
<Carousel :carouselList = "floor.carouselList" />
</div>