一个基于Vue的图片轮播组件的实现

1. 在线DEMO

va-carousel.xiaoshang.onlinevue

Githubnode

2. 首先是一张思惟导图

导图

3. 而后是以上属性的标注说明

标注

4. 代码层

4.1 除去可从父组件接收的属性,组件自身有如下属性:git

data() {
    return {
      list: [],     // 当前显示的图片列表
      hover: false, // 鼠标是否悬浮在组件上
      timer: null,  // 自动切换的 setInterval
      itemWidth: '',// 每项元素的宽度
      isReverse: false // 是不是反向切换,触发prev时,该属性为true
    }
  }
复制代码

4.2 组件挂载以前github

  1. 计算每项元素的宽度,即itemWidth的值
  2. 初始化显示的图片列表,即list。这里存储的数据才是真正会被在页面上渲染的。每次切换,实际上就是修改该list中的数据,对应的视图会自动更新,数据驱动视图嘛。
beforeMount() {
    this.itemWidth = 100 / this.total + '%'
    this.list = this.items.slice(0, this.total)
  },

复制代码

4.3 组件挂在后,检查autoplay属性,若该属性为true,则产生一个计时器vue-cli

mounted() {
    if (this.autoplay) {
      this.startTimer()
    }
  },
复制代码

4.4 startTimer函数很简单,就是间隔必定时间触发一次next(向后)切换npm

// 开始计时器
startTimer() {
    if (!this.interval || this.interval <= 0) {
        return
    }
    this.timer = setInterval(this.next, this.interval)
}
复制代码

4.5 next函数json

// 下一张
    next() {
      // 若是图片列表小于须要显示的数量,则不进行滚动
      if (this.items.length < this.total) {
        return
      }

      // 向后追加一个元素,该元素为:
      // 显示列表中最后一个元素在原数组中的后一个元素
      // 若是已是最后一个元素,则使用第一个元素

      let indexOfItems = this.items.findIndex(
        item => item.id === this.list[this.list.length - 1].id
      )

      if (indexOfItems === this.items.length - 1) {
        // 使用第一个元素
        this.list.push(this.items[0])
      } else {
        // 使用后一个元素
        this.list.push(this.items[indexOfItems + 1])
      }
      // 移除当前显示图片中的第一个
      this.list.shift()
      this.isReverse = false
    },
复制代码

4.6 对应的还有一个prev函数,与next函数逻辑相反,这里就不展现代码了数组

4.7 点击图片时,向父组件释放事件selectedItem,传递两个参数 item 和 index 分别为当前点击的对象,和该对象在list中的位置框架

// 点击图片
    selectedItem(item, index) {
      this.$emit('selectedItem', item, index)
    },
复制代码

4.8 鼠标悬浮在组件上时,中止自动切换(若autoplay为ture), 鼠标离开时,继续切换函数

handleMouseEnter() {
      this.hover = true
      this.pauseTimer()
    },

    handleMouseLeave() {
      this.hover = false
      if (this.autoplay) {
        this.startTimer()
      }
    },
复制代码

4.9 而后是过渡效果的实现

由于arrow元素也在transition-group中,因此当arrow=‘hover’时,arrow的显示、隐藏也会触发钩子函数,可是咱们的钩子函数是针对image-item写的,因此须要在函数中检测是哪一个元素触发的,这里经过检查className进行判断。 而后针对向前、向后两种状况设置不一样的样式

beforeEnter(el) {
      // 只对image-item使用过渡
      let isImageItem = el.className.indexOf('image-item') > -1
      if (isImageItem) {
        el.style.opacity = 0
        if (this.isReverse) {
          el.style.transform = 'translateX(-100%)'
        } else {
          el.style.transform = 'translateX(100%)'
        }
      }
    }
复制代码

4.10 这里使用了Velocity,这是一个实现动画效果的js库,之因此使用这个库是由于试了n种方案都没能实现预期效果emm

enter(el, done) {
      // 只对image-item使用过渡
      let isImageItem = el.className.indexOf('image-item') > -1
      if (isImageItem) {
        Velocity(el, { opacity: 1, translateX: '0px' }, { complate: done })
      } else {
        done()
      }
    }
复制代码

4.11 而后是对应的beforeLeave、leave函数,这里就不展现了

以上基本就是全部js部分,总体感觉就是,一旦实现逻辑搞清楚,代码实现起来仍是挺容易的,而后就是框架的熟悉程度。

5. npm包发布

这本是公司业务中的一个功能需求,由于没能在网上找到现成的轮子,找个差很少的效果领导不满意,因此只能本身写了,作都作了不发出来岂不是白写了. . .

npm发布流程简单归纳就是

1.注册

去npm官网注册个帐号

2.生成npm包 文件夹中有package.json文件就是一个npm包

3.在终端使用npm publish发布包,成功以后,该项目文件夹下全部文件都会上传至npm官网,当用户使用npm install安装后,就会将整个文件夹下载至node_modules文件夹中,对于这个项目,就是一个使用vue-cli生成的vue项目,组件路径src/components/VaCarousel.vue,因此使用npm install va-carousel安装以后,只须要在项目中像这样导入便可使用(前提是你的项目也是使用vue-cli生成的,对于其余方式创建的项目可能会出现一些错误):import VaCarousel from 'va-carousel/src/components/VaCarousel.vue'

以上

相关文章
相关标签/搜索