Vue-swiper组件封装

一. swiper学习
      https://www.swiper.com.cn/

      可以观看以上教程
二. 自定义组件的封装
      自定义封装swiper组件(基于swiper)
      注意: 防止swipe初始化过早(利用key值和Vue的生命周期)

1.引入文件

   

<script src="./js/vue.js"></script>
<link rel="stylesheet" href="./swiper/css/swiper.css">
<script src="./swiper/js/swiper.js"></script>

2.写swiper

 new Swiper ('.a',{
          // direction: 'vertical'
          loop:true,
          // 如果需要分页器
          pagination: {
               el: '.swiper-pagination',
          }
 })

3.在vue中使用

div id="box">
        <div class="swiper-container a">
            <div class="swiper-wrapper">
                <div class="swiper-slide" v-for='data in datalist'>
                    {{data}}  <!-- 动态 -->
                </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>
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                datalist:[]
            },
            mounted() {
                setTimeout(()=>{
                    //异步请求回来的
                    this.datalist = ['111','222','333']

                  
                    //swiper初始化过早
                },2000)
            },

            updated() {

                new Swiper ('.a',{
                        // direction: 'vertical'
                        loop:true,
                            // 如果需要分页器
                        pagination: {
                            el: '.swiper-pagination',
                        }
                })

            },
        })
    </script>

这里需要考虑初始化的swiper需要放在哪里,如果放在mounted生命周期的setTimeout中,就会出现生命周期过早的BUG,所以考虑将初始化的值放在updated生命周期内,Vue渲染dom完毕后才开始初始化。

4.封装组件

因为组件是可能需要到处使用的,所以考虑封装组件,并且,组件可以轮播任何一种东西,比如:图片,文字,等等,所以考虑使用插槽,具体代码如下,有几点需要格外注意

<body>
    <div id="box">
        <swiper  :key='datalist.length'>
            <img   class="swiper-slide" v-for='data in datalist' :src="data" alt="">
        </swiper>
    </div>
    <script>

        //封装一个组件进行轮播
        Vue.component('swiper',{
            //插槽技术
            template:`
            <div class="swiper-container a">
                <div class="swiper-wrapper">
                        <slot>
                        </slot>   
                </div>
            <!-- 如果需要分页器 -->
                <div class="swiper-pagination">
                
                </div>
            </div>
            `,
            mounted() {
            new Swiper ('.a',{
                // direction: 'vertical'
                loop:true,
                    // 如果需要分页器
                pagination: {
                    el: '.swiper-pagination',
                }
            })
            },
        })
        new Vue({
            el:"#box",
            data:{
                datalist:[],
            },
            mounted(){
                //处理异步操作
                setTimeout(()=>{
                    this.datalist = ['./img/11.jpg','./img/12.jpg','./img/15.jpg']
                    //异步更新时才直接改key值
                },2000)
            },
        })
    </script>
</body>

首先第一个就是key值得设置,因为diff算法的比较规则比较特殊,Vue存在着复用的操作,它会逐一比较,key值不一样才会“干掉”,不然会直接复用,所以考虑把key值动态设置成数组的长度,不设置也行,但是需要保证key在mounted中进行了变化,下面这种操作也是可以的。

 new Vue({
            el:"#box",
            data:{
                datalist:[],
                key:0
            },
            mounted(){
                //处理异步操作
                setTimeout(()=>{
                    this.datalist = ['./img/11.jpg','./img/12.jpg','./img/15.jpg']
                    //异步更新时才直接改key值
                    key=1
                },2000)
            },
        })

第二个注意点就是,swiper初始化到底放在哪里,还是父组件的updated中吗?很显然不应该,因为我已经把它封装成组件了,所以不应该还需要依赖父组件,不然以后别人使用这个组件,还需要考虑你父组件中的内容?

那应该在哪里初始化,我们考虑在子组件的mounted生命周期内进行初始化,这样不会出现初始化过早的问题,它会等到父组件Vue渲染完dom后才进行初始化。

下面是演示图

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李李·.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值