最近开发pc官网,用到了轮播图,在这里记录一下使用过程中遇到的问题。
之前用jquery开发项目的时候,用的是swiper3。现在用vue开发,我一开始尝试用了最新的swiper6,我把官网的demo里的代码复制过来,结果发现要不是下标小圆点失效,要不就是切换功能失效,不知道问题出在哪里。搞了很久,最后用了swiper3的使用方法。

轮播图引入的版本是"vue-awesome-swiper": "^2.6.7",
main.js里面写的是

import VueAwesomeSwiper from 'vue-awesome-swiper'

// require styles
import 'swiper/dist/css/swiper.css'

Vue.use(VueAwesomeSwiper, /* { default global options } */)

HTML内容:

    <swiper v-if="ListBanner.length" :options="swiperOption" class="swiper-container swiper-container1 wow fadeInUp"
      ref="mySwiper">
      <!-- slides -->
      <swiper-slide class="swiper-item" v-for="(item, index) of ListBanner" :key="index">
        <img class="swiper-img" :src="item.banner" alt="" />
      </swiper-slide>
      <!-- Optional controls ,显示小点-->
      <div class="swiper-pagination" slot="pagination" v-if="ListBanner.length > 1"></div>
      <!-- 左右切换 -->
      <!-- <div class="swiper-button-prev" slot="button-prev"></div>
        <div class="swiper-button-next" slot="button-next"></div> -->
    </swiper>

data里的配置:

        swiperOption: {
          // 参数选项,显示小点
          pagination: ".swiper-pagination",
          paginationClickable: true,
          //循环
          loop: true,
          //每张播放时长3秒,自动播放
          autoplay: 2000,
          // 用户操作swiper之后,是否禁止autoplay
          autoplayDisableOnInteraction: false,
          //滑动速度
          speed: 1000,
          // delay:1000
          prevButton: ".swiper-button-prev",
          nextButton: ".swiper-button-next",

          observer: true, //修改swiper自己或子元素时,自动初始化swiper
          observeParents: true, //修改swiper的父元素时,自动初始化swiper

          onSlideChangeStart: function (swiper) {
            that.active = swiper.realIndex;
            //   this.realIndex + 1
            // console.log(swiper.realIndex);
          },
        },

computed里的配置(我写的代码也参考了好多其他前辈的代码,我觉得写得挺好的)

    computed: {
      swiper() {
        return this.$refs.mySwiper.swiper;
      }
    },

然后下面就可以使用了,因为我的轮播图图片是ajax请求回来的,所以需要在轮播图的容器上写一个判断
image

否则会出现页面加载完成轮播图会滚动到最后一张的bug。

然后我这边还有一个需求,只有图片大于一张才会自动轮播,所以代码要填加一下:
mounted里的:

      Home().then((response) => {
        console.log(response.data, "Home");
        if (response.data.ReturnCode == 0) {
          if (response.data.Data) {
            var data = response.data.Data;
            this.ListBanner = data[0].ListBanner;
            // this.ListNews = data[0].ListNews;
            this.ListPhysician = data[0].ListPhysician;

            this.$nextTick(() => {
              if (this.ListBanner.length <= 1) {
                this.swiper.stopAutoplay();
                this.swiper.lockSwipes();
              }
              if (this.ListPhysician.length <= 1) {
                this.swiper3.stopAutoplay();
                this.swiper3.lockSwipes();
              }

              this.wowFun();
            });
            // console.log(this.ListNews);

            // new WOW().init();
          }
        }
      });

image.png

一定要放在this.$nextTick里的判断才会生效。
this.swiper.stopAutoplay();是停止自动轮播
this.swiper.lockSwipes();是禁止滑动
如果不显示小圆点和左右切换,加上v-if="ListBanner.length > 1"就可以了。

如果要实现时间控制轮播图轮播图,如图:
image

        swiperOption: {
          // 参数选项,显示小点
          pagination: ".swiper-pagination",
          paginationClickable: true,
          //循环
          loop: true,
          //每张播放时长3秒,自动播放
          autoplay: 2000,
          // 用户操作swiper之后,是否禁止autoplay
          autoplayDisableOnInteraction: false,
          //滑动速度
          speed: 1000,
          // delay:1000
          prevButton: ".swiper-button-prev",
          nextButton: ".swiper-button-next",

          onSlideChangeStart: function (swiper) {
            that.active = swiper.realIndex;
            //   this.realIndex + 1
            // console.log(swiper.realIndex);
          },
        },

事件写在onSlideChangeStart里面
控制轮播图的滚动写在:methods里面(didi是我随便起的名字,是那个点击时间日期的事件):

      didi(index) {
        this.active = index;
        this.swiper.slideTo(index + 1, 1000, false);
      },

这是我首页轮播图配置的全部代码(不相关的删掉了一些):

<template>
  <div class="index">
    <commonHeader></commonHeader>
    <!-- <router-link to="/a">
      <p>跳转a页面</p>
    </router-link>
    <router-link to="/b">
      <p>跳转b页面</p>
    </router-link> -->

    <!-- <p>我是首页</p> -->

    <!-- isKeep -->
    <swiper v-if="ListBanner.length" :options="swiperOption" class="swiper-container swiper-container1 wow fadeInUp"
      ref="mySwiper">
      <!-- slides -->
      <swiper-slide class="swiper-item" v-for="(item, index) of ListBanner" :key="index">
        <img class="swiper-img" :src="item.banner" alt="" />
      </swiper-slide>
      <!-- Optional controls ,显示小点-->
      <div class="swiper-pagination" slot="pagination" v-if="ListBanner.length > 1"></div>
      <!-- 左右切换 -->
      <!-- <div class="swiper-button-prev" slot="button-prev"></div>
        <div class="swiper-button-next" slot="button-next"></div> -->
    </swiper>
    <!-- <div class="banner" v-if="ListBanner.length == 1">
        <img class="banner-img" :src="ListBanner[0].banner" alt="">
      </div> -->

    <commonFooter></commonFooter>
  </div>
</template>

<script>
  // ajax
  import { Home, NewsListTop } from "@/assets/js/api";
  // vuex
  import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
  // import { Swiper, SwiperItem } from 'vux'
  import commonHeader from "@/components/header";
  import commonFooter from "@/components/footer";

  import { WOW } from "wowjs";

  export default {
    name: "home",
    components: {
      commonHeader,
      commonFooter,
    },
    data() {
      const that = this;
      return {
        // 轮播图
        ListBanner: [],
        // 新闻
        ListNews: [],
        // 名医荟萃
        ListPhysician: [],

        swiperOption: {
          // 参数选项,显示小点
          pagination: ".swiper-pagination",
          paginationClickable: true,
          //循环
          loop: true,
          //每张播放时长3秒,自动播放
          autoplay: 2000,
          // 用户操作swiper之后,是否禁止autoplay
          autoplayDisableOnInteraction: false,
          //滑动速度
          speed: 1000,
          // delay:1000
          prevButton: ".swiper-button-prev",
          nextButton: ".swiper-button-next",

          observer: true, //修改swiper自己或子元素时,自动初始化swiper
          observeParents: true, //修改swiper的父元素时,自动初始化swiper

          onSlideChangeStart: function (swiper) {
            that.active = swiper.realIndex;
            //   this.realIndex + 1
            // console.log(swiper.realIndex);
          },
        },



        // isKeep: true,
      };
    },
    computed: {
      swiper() {
        return this.$refs.mySwiper.swiper;
      },

    },
    methods: {
      // didi(index) {
      //   this.active = index;
      //   this.swiper.slideTo(index + 1, 1000, false);
      // },
      enter() {
        // alert(1)
        this.swiper2.stopAutoplay();
      },
      leave() {
        this.swiper2.startAutoplay();
      },
      // wow动画
      wowFun() {
        var wow = new WOW({
          // 距离可视区域多少开始执行动画
          offset: 150,
          // 异步加载的内容是否有效
          live: true,
        });
        wow.init();
      },




    },
    created() { },
    mounted() {


      console.log(document.documentElement.scrollTop)


      Home().then((response) => {
        console.log(response.data, "Home");
        if (response.data.ReturnCode == 0) {
          if (response.data.Data) {
            var data = response.data.Data;
            this.ListBanner = data[0].ListBanner;
            // this.ListNews = data[0].ListNews;
            this.ListPhysician = data[0].ListPhysician;

            this.$nextTick(() => {
              if (this.ListBanner.length <= 1) {
                this.swiper.stopAutoplay();
                this.swiper.lockSwipes();
              }
              if (this.ListPhysician.length <= 1) {
                this.swiper3.stopAutoplay();
                this.swiper3.lockSwipes();
              }

              this.wowFun();
            });
            // console.log(this.ListNews);

            // new WOW().init();
          }
        }
      });

    },

    activated() {

    },

    deactivated() {

    },
  };
</script>


<style lang="scss" scoped>
  @import "~@/assets/scss/home.scss";
</style>

这是我在vue中使用轮播图遇到的一些问题,希望能帮到需要的人。


我的一个道姑朋友
80 声望4 粉丝

星光不问赶路人,岁月不负有心人。