Vue 组件 - Swiper

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 - Swiper

目录

Swiper

Swiper静态

下载swiper

引入swiper

简单轮播

Swiper动态

封装swiper组件

引入vue

封装组件

更新中实例化

这种写法弊端

优化

防止复用

第一种

第二种

增加循环

总结


Swiper

综合运用,创建一个轮播组件;轮播组件的封装

Swiper静态

直接下载swiper中的js和css在静态网页中引用css和js。

下载swiper

Swiper网址 下载Swiper - Swiper中文网

下载后解压使用这如下两个文件。

 

引入swiper

创建目录后,把swiper的js和css文件放入。

示例如下:

 

简单轮播

依照官网使用示例,做一个简单的静态轮播。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./swiper/swiper-bundle.css">
    <style>
        .swiper {
            width: 600px;
            height: 300px;
        }
    </style>
</head>
<body>
<div class="swiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>

    <!-- 如果需要导航按钮 -->
    <div class="swiper-button-prev"></div>
    <div class="swiper-button-next"></div>

    <!-- 如果需要滚动条 -->
    <div class="swiper-scrollbar"></div>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script>
    var mySwiper = new Swiper ('.swiper', {
        direction: 'vertical', // 垂直切换选项
        loop: true, // 循环模式选项

        // 如果需要分页器
        pagination: {
            el: '.swiper-pagination',
        },

        // 如果需要前进后退按钮
        navigation: {
            nextEl: '.swiper-button-next',
            prevEl: '.swiper-button-prev',
        },

        // 如果需要滚动条
        scrollbar: {
            el: '.swiper-scrollbar',
        },
    })
</script>
</body>
</html>

 

Swiper动态

把静态轮播改为动态获取数据后,渲染swiper轮播内容。

在init函数中处理new swiper。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./swiper/swiper-bundle.css">
    <style>
        .swiper {
            width: 600px;
            height: 300px;
        }
    </style>
</head>
<body>
<div class="swiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>

    <!-- 如果需要导航按钮 -->
    <div class="swiper-button-prev"></div>
    <div class="swiper-button-next"></div>

    <!-- 如果需要滚动条 -->
    <div class="swiper-scrollbar"></div>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script>
    setTimeout(()=> {
        var list = ["11111", "22222", "33333"]
        var newlist = list.map(item=>`<div class="swiper-slide">${item}</div>`)

        var owrapper = document.querySelector(".swiper-wrapper")
        owrapper.innerHTML = newlist.join('')

        // dom插入完之后, new swiper
        init()
    }, 2000)

    // 初始化 swiper
    function init() {
        console.log("初始化")
        new Swiper ('.swiper', {
            direction: 'vertical', // 垂直切换选项
            loop: true, // 循环模式选项

            // 如果需要分页器
            pagination: {
                el: '.swiper-pagination',
            },

            // 如果需要前进后退按钮
            navigation: {
                nextEl: '.swiper-button-next',
                prevEl: '.swiper-button-prev',
            },

            // 如果需要滚动条
            scrollbar: {
                el: '.swiper-scrollbar',
            },
        })
    }
</script>
</body>
</html>

 

封装swiper组件

利用之前学到的生命周期来封装一个swiper组件。

引入vue

创建文件后,引入vue.js文件。

示例如下:

<script src="../lib/vue.js"></script>

 

封装组件

把原来的轮播使用vue封装为组件,方便调用。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="./swiper/swiper-bundle.css">
  <style>
    .swiper-container {
      width: 600px;
      height: 300px;
    }
  </style>
</head>
<body>
<div id="box">
  <header>导航</header>
  <div class="swiper-container demo">
    <div class="swiper-wrapper">
      <!--<div class="swiper-slide">Slide 1</div>
      <div class="swiper-slide">Slide 2</div>
      <div class="swiper-slide">Slide 3</div>-->
      <div class="swiper-slide" v-for="data in datalist" :key="data">
        <img :src="data" alt=""/>
      </div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>
  </div>
  <footer>底部内容</footer>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>

  new Vue({
    el: '#box',
    data: {
      datalist:[],
    },
    mounted() {
      // ajax
      setTimeout(()=> {
        this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg",
        "https://tsj.youdubook.com/cover/book_cover_6.jpg",
        "https://tsj.youdubook.com/cover/book_cover_265.jpg",
        "https://tsj.youdubook.com/cover/book_cover_2819.jpg",
        "https://tsj.youdubook.com/cover/book_cover_219.jpg"]
      }, 2000)

      // 此时过早
    },
  })
</script>
</body>
</html>

 

更新中实例化

异步的请求数据,直接在创建完成时去实例化轮播组件,会无法渲染列表;

因为这时dom还在diff比对获取的是空列表。需要在更新后再去实例化。

示例如下:

updated() {
  console.log(document.querySelectorAll(".swiper-slide").length)
  new Swiper(".demo", {
    // 如果需要分页器
    pagination: {
      el: '.swiper-pagination',
    },
    loop:true,
    autoplay: {
      delay: 2500,
      disableOnInteraction:false
    }
  })
}
这种写法弊端

1.无法复用

2.如果当前页面并非只有datalist,还有其他状态更新也会触发生命周期的更新阶段。

优化

对原来的写法进行优化。把轮播功能封装为轮播容器和轮播内容两个组件,在组件挂载后实例化swiper;通过vue请求并更新数据。在页面中使用组件控件和slot插槽渲染页面内容。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="./swiper/swiper-bundle.css">
</head>
<body>
<div id="box">
    <swiper>
        <!--改为动态数据-->
        <swiper-item v-for="data in datalist"  :key="data">
            <img :src="data" alt="">
        </swiper-item>
    </swiper>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>
    Vue.component("swiperItem", {
        template:`
        <div class="swiper-slide">
            <slot></slot>
        </div>
        `
    })

    Vue.component("swiper", {
        template:`
        <div class="swiper-container demo">
            <div class="swiper-wrapper">
              <slot></slot>
            </div>
            <div class="swiper-pagination"></div>
      </div>`,

        // 组件挂载后 直接示例swiper
        mounted() {
            new Swiper(".demo", {
                // 如果需要分页器
                pagination: {
                    el: '.swiper-pagination',
                },
                loop:true,
                autoplay: {
                    delay: 2500,
                    disableOnInteraction:false
                }
            })
        }
    })

    // vue去请求并更新数据
    new Vue({
        el: '#box',
        data: {
            datalist:[],
        },
        mounted() {
            // ajax
            setTimeout(()=> {
                this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg",
                    "https://tsj.youdubook.com/cover/book_cover_6.jpg",
                    "https://tsj.youdubook.com/cover/book_cover_265.jpg",
                    "https://tsj.youdubook.com/cover/book_cover_2819.jpg",
                    "https://tsj.youdubook.com/cover/book_cover_219.jpg"]
            }, 2000)
        }
    })
</script>
</body>
</html>

防止复用

防止swiper复用的方式。

第一种

在异步情况下swiper要增加key绑定数组长度。防止swiper复用。

示例如下:

<swiper>
    <!--改为动态数据-->
    <swiper-item v-for="data in datalist" :key="data">
        <img :src="data" alt="">
    </swiper-item>
</swiper>

 

第二种

通过if判断列表的长度。

示例如下:

<div id="box">
    <swiper v-if="datalist.length">
        <!--改为动态数据-->
        <swiper-item v-for="data in datalist" :key="data">
            <img :src="data" alt="">
        </swiper-item>
    </swiper>
</div>

 

增加循环

在轮播到最后一个时,需要进行循环。

在组件使用时传递属性,在加载完成时使用属性。

组件使用时传递loop属性

示例如下:

组件中接收loop属性值。

示例如下:

在组件实例化swiper时,使用传递的loop属性值。

示例如下:

 

对传值进行限制和设置默认值。

示例如下:

props:{
    loop: {
        type:Boolean,
        default:true
    }
},

 

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 - Swiper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值