美文网首页
vue轮播图组件

vue轮播图组件

作者: 飞飞廉 | 来源:发表于2018-02-06 23:35 被阅读0次

采用better-scroll组件,是一个适用于易懂端的滚动插件。具体插件使用详情请查看https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/installation.html#npm

<template>
<div class="slider" ref="slider">
  <div class="slider-group" ref="sliderGroup">
    <slot></slot>
  </div>
  <div class="dots">
    <span class="dot" :class="{active:currentPageIndex===index}" v-for="(item,index) in dots"></span>
  </div>
</div>
</template>

<script>
import {addClass} from '@/assets/js/dom.js';
import BScroll from 'better-scroll';
export default {
  name: 'Slider',
  props:{
    loop:{
      type:Boolean,
      default:true
    },
    autoPlay:{
      type:Boolean,
      default:true
    },
    interval:{
      type:Number,
      default:4000
    }
  },
  data () {
    return {  
        dots:[],
        currentPageIndex:0 
    }
  },
  mounted(){
    setTimeout(()=>{
      this._setSliderWidth();
      this._initDots();
      this._initSlider();
      if(this.autoPlay){
        this._play();
      }
    },20)

    window.addEventListener('resize',()=>{
      
      if(!this.slider){
        return;
      }
      this._setSliderWidth(true);
      this.slider.refresh();
    })
  },
  methods:{
      _setSliderWidth(isResize){
        this.children=this.$refs.sliderGroup.children;
        let width=0;
        let sliderWidth=this.$refs.slider.clientWidth;
        console.log(sliderWidth)
        for (let i = 0; i < this.children.length; i++) {
          let child=this.children[i];
          addClass(child,'slider-item');
          child.style.width=sliderWidth+'px';
          width+=sliderWidth;
        }
        if(this.loop && !isResize){
          width+=2*sliderWidth;
        }
        this.$refs.sliderGroup.style.width=width+'px';
      },
      _initSlider(){
        this.slider=new BScroll(this.$refs.slider,{
          scrollX:true,
          scrollY:false,
          momentum:false,//惯性
          snap:true,
          snapLoop:this.loop,
          snapThreshold:0.3,
          snapSpeed:400,
        })
        this.slider.on('scrollEnd',()=>{
          let pageIndex=this.slider.getCurrentPage().pageX;
          
          if(this.loop){
            pageIndex-=1;
          }
          this.currentPageIndex=pageIndex;
          if(this.autoPlay){
            clearTimeout(this.timer)
            this._play();
          }

        })
      },
      _initDots(){
        this.dots=new Array(this.children.length);
      },
      _play(){
        let pageIndex=this.currentPageIndex+1;
        if(this.loop){
          pageIndex+=1;
        }
        this.timer=setTimeout(()=>{
          this.slider.goToPage(pageIndex,0,400);
        },this.interval)
      }
  },
  destroyed(){
    clearTimeout(this.timer)
  }
}
</script>


<style lang="scss">
  @import '../../assets/sass/_variable.scss';
  .slider{
    overflow:hidden;
    position:relative;
    .slider-group{
      overflow:hidden;
      white-space:nowrap;
      .slider-item{
        float:left;
        box-sizing:border-box;
        overflow:hidden;
        a{
          display:block;
          width:100%;
          overflow:hidden;
          text-decoration:none;
          img{
          display:block;
          width:100%;
          }
        }
        
      }

    }
    .dots{
      position:absolute;
      left:0;
      right:0;
      bottom:0;
      text-align:center;
      display:inline-block;
      .dot{
          display:inline-block;
          width:0.8rem;
          height:0.8rem;
          border-radius:50%;
          margin:0 0.4rem;
          background-color:#fff;
          &.active{
            width:2rem;
            border-radius:0.5rem;
            background-color:$color-theme;
          }
      }

    }
  }  
</style>

问题一:
取不到数据,是由于在使用slider父组件recommend.vue中,加载slot组件的时候还没取到数据,所以加载的是空数据,所以要在父组件中写一个v-if

<slider v-if="recommend.length">
      <div v-for="item in recommend">
        <a :href="item.linkUrl">
          <img :src="item.picUrl" alt="">
        </a>
      </div>
 </slider>

相关文章

网友评论

      本文标题:vue轮播图组件

      本文链接:https://www.haomeiwen.com/subject/jrunzxtx.html