nuxt中使用轮播图组件vue-awesome-swiper

9,630 阅读3分钟

官方推荐在ssr中使用的是directive模式
vue-awesome-swiper具有一个内置directive的客户端渲染Swiper。directive最大的好处是HTML仍可以在服务器端渲染网页并输出,以便搜索引擎可以正确捕获目标内容。

directive模式

<div v-swiper="swiperOption"> 
  <div class="swiper-wrapper"> 
    <div class="swiper-slide"> 
      在服务器中呈现原始HTML,在浏览器(客户端)中呈现Swiper 
    </ div> 
  </ div> 
</ div>

有了这个案例,我们可以在官网获取不同的样式,然后改造成directive模式

1. 在vue中正常使用

具体配置这个教程很多,步骤就不一一写明了


<template>
  <swiper class="swiper" :options="swiperOption">
    <swiper-slide>Slide 1</swiper-slide>
    <swiper-slide>Slide 2</swiper-slide>
    <swiper-slide>Slide 3</swiper-slide>
    <swiper-slide>Slide 4</swiper-slide>
    <swiper-slide>Slide 5</swiper-slide>
    <swiper-slide>Slide 6</swiper-slide>
    <div class="swiper-pagination" slot="pagination"></div>
  </swiper>
</template>

<script>
  import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
  import 'swiper/css/swiper.css'

  export default {
    name: 'swiper-example-pagination',
    title: 'Pagination',
    components: {
      Swiper,
      SwiperSlide
    },
    data() {
      return {
        swiperOption: {
          pagination: {
            el: '.swiper-pagination'
          }
        }
      }
    }
  }
</script>

<style lang="scss" scoped>
  @import './base.scss';
</style>

实现的效果如下

2. 在Nuxt中使用

2-1. 安装

npm install -S swiper vue-awesome-swiper

2-2. plugins文件夹新建vue-swiper.js文件

import Vue from "vue";
import VueAwesomeSwiper from "vue-awesome-swiper";

Vue.use(VueAwesomeSwiper);

2-3. 在nuxt.config.js中配置

  /*
   ** Global CSS
   */
  css: ["element-ui/lib/theme-chalk/index.css", "swiper/css/swiper.css"],
  /*
   ** Plugins to load before mounting the App
   */
  plugins: [
    { src: "@/plugins/element-ui", ssr: true },
    { src: "@/plugins/vue-swiper.js", ssr: false }
  ],

2-4. 使用directive模式

<template>
  <div v-swiper="swiperOption">
    <div class="swiper-wrapper">
      <div v-for="(item, index) in dataImage" :key="index" class="swiper-slide">
        <img :src="item.imgUrl" />
      </div>
    </div>
    <div slot="pagination" class="swiper-pagination"></div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      dataImage: [
        {
          imgUrl: require("../../assets/images/bgtop.jpg")
        },
        {
          imgUrl: require("../../assets/images/bgtop2.jpg")
        },
         {
          imgUrl: require("../../assets/images/bgtop3.jpg")
        }
      ],
      swiperOption: { // 配置说明直接看官网
        lazy: {
          loadPrevNext: true
        },
        spaceBetween: 30,
        pagination: {
          el: ".swiper-pagination",
          clickable: true
        }
      }
    };
  },
  beforeMount() {},
  methods: {}
};
</script>

实现效果如下

2-5. 实现鼠标移出移入的特殊效果

首先我们设置图片自动播放,我们想要的效果是鼠标移入停止自动播放,移出则继续自动播放

改动如下

<template>
// 改动一
  <div
    v-swiper:swiper="swiperOption"
    @mouseenter="stopSwiper"
    @mouseleave="startSwiper"
  >
    <div class="swiper-wrapper">
      <div v-for="(item, index) in dataImage" :key="index" class="swiper-slide">
        <img :src="item.imgUrl" />
      </div>
    </div>
    <div slot="pagination" class="swiper-pagination"></div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      dataImage: [
        {
          imgUrl: require("../../assets/images/bgtop.jpg")
        },
        {
          imgUrl: require("../../assets/images/bgtop2.jpg")
        }
      ],
      swiperOption: {
      // 改动二
        autoplay: {
          delay: 1500,
          disableOnInteraction: false
        },
        lazy: {
          loadPrevNext: true
        },
        spaceBetween: 30,
        pagination: {
          el: ".swiper-pagination",
          clickable: true
        }
      }
    };
  },
  beforeMount() {},
  // 改动三
  swiper() {
    // 如果你需要得到当前的swiper对象来做一些事情,你可以像下面这样定义一个方法属性来获取当前的swiper对象,同时notNextTick必须为true
    return this.$refs.swiperBox.swiper;
  },
  methods: { // 改动四
    stopSwiper() { // 鼠标移入停止播放
      this.swiper.autoplay.stop();
    },
    startSwiper() { // 移出继续播放
      this.swiper.autoplay.start();
    }
  }
};
</script>

实现效果如下

参考资料:

vue-awesome-swiper
vue-awesome-swiper案例
nuxt.js安装vue-awesome-swiper