Vue使用swiper问题(5.2.0版本,避免踩坑)

 更新时间:2023年04月13日 11:02:44   作者:难逃月色..  
这篇文章主要介绍了Vue使用swiper问题(5.2.0版本,避免踩坑),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Vue使用Swiper看这一篇就够了

如果你还在用swiper@5.0以下的版本,如果你还在为坑多解决不了而烦恼,(ps:我已经踩了好多天的坑了)那么你不妨静下心来看完这篇博客,相信你会选择5.0版本的!!!

满足以下需求:

  • 完成swiper动态异步数据下的slide重新渲染
  • 解决loop:true设置时的事件丢失问题
  • swiper鼠标移入/移出 暂停/开始轮播
  • 单页面渲染多个swiper组件互不影响
  • slide只有一页时停止自动滚动
  • 自定义配置选项

一、下载指定版本swiper

npm i swiper@5.2.0

二、创建轮播图组件CarouselContainer.vue

详细解析在代码注释中

<template>
  <div
    class="CarouselContainer"
    @mouseenter="stopAutoPlay"
    @mouseleave="startAutoPlay"
  >
    <div ref="mySwiper" class="swiper-container" :id="currentIndex">
      <div class="swiper-wrapper">
        <div
          class="swiper-slide my-swiper-slide"
          v-for="(item, index) of slideList"
          :key="index"
        >
          {{ item }}
        </div>
      </div>
      <!-- 分页器 -->
      <!-- <div class="swiper-pagination"></div> -->
      <!--导航器-->
      <div class="swiper-button-prev"></div>
      <div class="swiper-button-next"></div>
    </div>
  </div>
</template>
<script>
import Swiper from "swiper";
import "swiper/css/swiper.css";
export default {
  name: "CarouselContainer",
  props: ["slideList", "currentIndex"],
  data() {
    return {
      currentSwiper: null,
    };
  },
  watch: {
    //slide数据发生变化时,更新swiper
    slideList: {
      deep: true,
      // eslint-disable-next-line
      handler(nv, ov) {
        console.log("数据更新了");
        this.updateSwiper();
      },
    },
  },
  mounted() {
    this.initSwiper();
  },
  methods: {
    //鼠标移入暂停自动播放
    stopAutoPlay() {
      this.currentSwiper.autoplay.stop();
    },
    //鼠标移出开始自动播放
    startAutoPlay() {
      this.currentSwiper.autoplay.start();
    },
    //初始化swiper
    initSwiper() {
      // eslint-disable-next-line
      let vueComponent = this; //获取vue组件实例
      //一个页面有多个swiper实例时,为了不互相影响,绑定容器用不同值或变量绑定
      this.currentSwiper = new Swiper("#" + this.currentIndex, {
        // 循环模式选项loop,默认为false,可动态设置,当slide只有一页时置为false,>1页时置为true
        loop: true, // 循环模式选项
        autoHeight: "true", //开启自适应高度,容器高度由slide高度决定
        //分页器
        // pagination: {
        //   el: '.swiper-pagination',
        //   clickable:true,//分页器按钮可点击
        // },
        //grabCursor: true, //小手掌抓取滑动
        // direction: "vertical", // 纵向滚动,默认是横向滚动的
        on: {
          //此处this为swiper实例
          //切换结束获取slide真实下标
          slideChangeTransitionEnd: function () {
            console.log(vueComponent.$props.currentIndex+"号swiper实例真实下标",this.realIndex)
          },
          //绑定点击事件,解决loop:true时事件丢失
          // eslint-disable-next-line
          click: function (event) {
            console.log("你点击了"+vueComponent.$props.currentIndex+"号swiper组件")
          },
        },
        //导航器
        navigation: {
          nextEl: ".swiper-button-next",
          prevEl: ".swiper-button-prev",
        },
        autoplay: {
          //自动播放,不同版本配置方式不同
          delay: 2000,
          stopOnLastSlide: false,
          disableOnInteraction: false, // 用户操作之后是否停止自动轮播默认true
        },
        slidesPerView: 1, //视口展示slide数1
        slidesPerGroup: 1, //slide数1页一组
      });
    },
    //销毁swiper
    destroySwiper() {
      try {
      // 此处destroy(bool1,bool2)
      // bool1代表是否销毁swiper实例
      // bool2代表是否销毁swiper样式(导航器、分页器等)
        this.currentSwiper.destroy(true, false);
      } catch (e) {
        console.log("删除轮播");
      }
    },
    //更新swiper(先销毁 再 重新初始化swiper)
    updateSwiper() {
      this.destroySwiper();
      this.$nextTick(() => {
        this.initSwiper();
      });
    },
  },
  // 组件销毁之前 销毁 swiper 实例
  beforeDestroy() {
    this.destroySwiper();
  },
};
</script>
<style scoped lang="scss">
.CarouselContainer {
  width: 100%;
  height: 100%;
  background-color: gray;
}
/*slide样式*/
.my-swiper-slide {
  height: 300px;
  background-color: pink;
}
/*swiper容器样式*/
.swiper-container {
  width: 700px;
  border: 1px solid red;
}
//   /*自定义分页器按钮被点击选中时的样式*/
//   ::v-deep(.swiper-pagination-bullet-active){
//     background-color: #d5a72f !important;
//     width: 20px;
//   }
//   /*自定义分页器按钮常规样式*/
//   ::v-deep(.swiper-pagination-bullet){
//     background-color: #9624bf;
//     opacity: 1;
//     width: 20px;
//   }
</style>

三、创建父组件Father.vue渲染多个swiper组件、模拟异步数据变化

<template>
  <div class="father">
    <!--传递不同的currentIndex 作为区分不同swiper组件的动态id-->
    <CarouselContainer :slide-list="list" currentIndex="1"></CarouselContainer>
    <CarouselContainer :slide-list="list" currentIndex="2"></CarouselContainer>
    <button @click="changeData">更换数据喽</button>
  </div>
</template>
<script>
import CarouselContainer from './components/CarouselContainer.vue'
export default {
  components: {
    CarouselContainer,
  },
  data(){
    return{
      list:['a','b','c']
    }
  },
  methods: {
    changeData(){
    	const swiperList = ['我是图片1','我是图片2','我是图片3'];
    	this.list = swiperList ;
    }
  }
}
</script>
<style scoped>
</style>

完成之后就可以在你的项目中看到效果啦,之后可以根据项目需求去改进…

修改

此处追加说明destroy()释放swiper实例的几种情况:

解决问题:内存增长

此处destroy(bool1,bool2)

  • bool1代表是否销毁swiper实例
  • bool2代表是否销毁swiper样式(导航器、分页器等)

情景一:如果只更新swiper里面的数据,destroy(true,false)

情景二:如果要销毁(跳转路由销毁组件,遍历重新new一个swiper实例)swiper实例,destroy(true,true)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Iview Table组件中各种组件扩展的使用

    Iview Table组件中各种组件扩展的使用

    这篇文章主要介绍了Iview Table组件中各种组件扩展的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • vue3.2自定义弹窗组件结合函数式调用示例详解

    vue3.2自定义弹窗组件结合函数式调用示例详解

    这篇文章主要为大家介绍了vue3.2自定义弹窗组件结合函数式调用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • vue使用once修饰符,使事件只能触发一次问题

    vue使用once修饰符,使事件只能触发一次问题

    这篇文章主要介绍了vue使用once修饰符,使事件只能触发一次问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 详细聊聊Vue中的MVVM模式原理

    详细聊聊Vue中的MVVM模式原理

    MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离,这篇文章主要给大家介绍了关于Vue.js中MVVM的相关资料,需要的朋友可以参考下
    2023-03-03
  • 在vue项目中配置你自己的启动命令和打包命令方式

    在vue项目中配置你自己的启动命令和打包命令方式

    这篇文章主要介绍了在vue项目中配置你自己的启动命令和打包命令方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue元素实现动画过渡效果

    vue元素实现动画过渡效果

    这篇文章主要介绍了vue元素实现动画过渡效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 解决Element ui导航栏选中背景色刷新消失的问题

    解决Element ui导航栏选中背景色刷新消失的问题

    这篇文章主要介绍了解决Element ui导航栏选中背景色刷新消失的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 详解VS Code使用之Vue工程配置format代码格式化

    详解VS Code使用之Vue工程配置format代码格式化

    这篇文章主要介绍了详解VS Code使用之Vue工程配置format代码格式化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Vue CLI2升级至Vue CLI3的方法步骤

    Vue CLI2升级至Vue CLI3的方法步骤

    这篇文章主要介绍了Vue CLI2升级至Vue CLI3的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Vue3.0导出数据为自定义样式Excel的详细实例

    Vue3.0导出数据为自定义样式Excel的详细实例

    在许多的后台系统中少不了导出Excel表格的功能,下面这篇文章主要给大家介绍了关于Vue3.0导出数据为自定义样式Excel的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论