手摸手,带你封装一个vue component

项目地址:vue-countTo
配套完整后台demo地址:vue-element-admin
系类文章一:手摸手,带你用vue撸后台 系列一(基础篇)
系类文章二:手摸手,带你用vue撸后台 系列二(登陆权限篇)
系类文章三:手摸手,带你用vue撸后台 系列三(实战篇)
系类文章四:手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)
系类文章:手摸手,带你优雅的使用 iconvue

为何选择本身封装第三方库

最近几个月我司把以前两三年的全部业务都用了 vue 重构了一遍,前台使用 vue+ssr,后台使用了 vue+element,在此过程当中封装和本身写了不少 vue component。其实vue 写 component 至关简单和方便,github上有不少的 vue component 都只是简单的包装了一些 jquery 或者原生 js 的插件,但我我的是不太喜欢使用这些第三方封装的。理由以下:jquery

  1. 不少第三方封装的组件参数配置项实际上是有缺损的。如一些富文本或者图表组件,配置项远比你想一想中的多得多,第三方封装组件很难覆盖所有全部配置。
  2. 第三方组件的更新频率很难保证。不少第三方封装组件并不能一直和原始组件保持同步更新速度,万一原始组件更新了某个你须要的功能,但第三方并无更新那岂不是很尴尬,并且不少第三方组件维护一段时间以后就不维护了。
  3. 灵活性和针对性。仍是那富文原本说,富文本在我司有不少定制化需求,咱们须要将图片上传七牛,须要将图片打水印,须要不少针对业务的特殊需求,使用第三方包装的组件是不合适的,通常基于第三方封装的组件是很难拓展的。

因此我以为大部分组件仍是本身封装来的更为方便和灵活一些。webpack

动手开干

接下来咱们一块儿手摸手教改造包装一个js插件,只要几分钟就能够封装一个专属于你的 vue component。封装对象:countUp.js,改造后结果 vue-countTogit

首先咱们用官方提供的 vue-cli 来构建项目 这里选择了 webpack-simple (组件相对而言比较简单,不须要不少复杂的功能,因此 webpack-simple 已经知足需求了)github

$ npm install -g vue-cli
$ vue init webpack-simple my-project
$ cd my-project
$ npm install

安装countup.jsweb

$ npm install countup.js
$ npm run dev

启动项目以后按照 countup.js 官方 demo 初始化插件vue-cli

app.vue

<template>
  <span ref='countup'></span>
</template>

<script>
import CountUp from 'countup.js'
export default {
  name: 'countup-demo',
  data () {
    return {
      numAnim:null
    }
  },
  mounted(){
    this.initCountUp()
  },
  methods:{
    initCountUp(){
      this.numAnim = new CountUp(this.$refs.countup,0, 2017)
      this.numAnim.start();
    }
  }
}
</script>

刷新页面,就这么简单,countUp.js 已经生效了。
图片描述npm

接下来查看 countUp.js 的 github 发现它定义了以下可配置参数json

clipboard.png

对应 vue 就是 props,类型和初始化一目了然。segmentfault

props: {
  start: {
    type: Number,
    default: 0
  },
  end: {
    type: Number,
    default: 2017
  },
  decimal: {
    type: Number,
    default: 0
  },
  duration: {
    type: Number,
    default: 2.5
  },
  options: {
    type: Object
  }
}

以后再将countup以前写死的配置项替换为动态props就能够了

this.numAnim = new CountUp(this.$refs.countup, 
                           this.start,
                           this.end,
                           this.decimal,
                           this.duration,
                           this.options)

使用组件

<vue-count-up :end="2500" :duration="2.5"></vue-count-up>

只要几分钟一个属于本身的原生组件就包装好了,就是这么简单。完整demo
这时候你若是以为使用countUp.js 还有些不知足你的需求,那你能够选择本身来造轮子了。

造轮子篇

首先固然是阅读源码
其实源码也就两部分核心代码
第一部分:主要是就是 requestAnimationFrame,在游览器不支持requestAnimationFrame 的状况下使用 setTimeout 来模拟,这段代码值得仔细阅读,本身在平时的项目中也能借鉴使用这段代码。
第二部分:就是 count 函数
看懂这两部分以后造轮子就至关的简单了, demo

造轮子过程当中发现 countUp,并无 autoplay 这个参数项可让组件自动开始count,不要紧。。。咱们能够本身来撸,咱们首先定义 autoplay 这个props为布尔值,默认全部组件 autoplay 为 true

props:{
   autoplay: {
     type: Boolean,
     required: false,
     default: true
   }
 }

定义好 props 以后只要在 mounted 生命周期内加一个判断就完事了。

mounted() {
  if (this.autoplay) {
    this.start();
  }
}

咱们的 countUp 组件能够自动 count 了!
clipboard.png

上传 npm

在不跨项目的状况下以前所作的已经知足需求了。但咱们不能就此知足,我想让世界上更多的人来使用个人插件,这时候就要上传 npmdemo

首先咱们新建一个index.js

import CountTo from './vue-countTo.vue'

// 导出模块
export default CountTo

//global 状况下 自动安装
if (typeof window !== 'undefined' && window.Vue) {
  window.Vue.component('count-to', CountTo)
}

同时咱们也要改造一下 webpack 的配置,由于不是全部使用你组件的人都是经过 npm 安装使用 import 引入组件的的。

还有不少人是经过 <script> 标签的方式直接引入的,因此咱们要将 libraryTarget 改成 umd 格式

library: 'CountTo',
libraryTarget: 'umd',
umdNamedDefine: true

大功告成,如今只要将它发布到 npm 就能够了,首先注册一个npm 帐号,
以后配置本身的 package.json (注意填写 version,每次发布的 version 不能相同;main 为入口文件地址)。
以后只要一行命令 npm publish 你的项目就发到 npm 了,快让小伙伴们一块儿来用你的vue component 吧!

clipboard.png

总结

这里这是拿了一个很简单的 countUp 组件举了一个简单例子,有的时候本身动手丰衣足食,不少插件的封装比想象中简单的多。产品经理不再会看到我由于这个fu**插件怎么不支持这个功能而愁眉苦脸了,咱们能够更好地知足产品了~~
完整项目地址:https://github.com/PanJiaChen... 欢迎 star

占坑

常规占坑,这里是手摸手,带你用vue撸后台系类
完整项目地址:vue-element-admin
系类文章一:手摸手,带你用vue撸后台 系列一(基础篇)
系类文章二:手摸手,带你用vue撸后台 系列二(登陆权限篇)
系类文章三:手摸手,带你用vue撸后台 系列三(实战篇)
系类文章四:手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)
系类文章:手摸手,带你优雅的使用 icon
楼主我的免费圈子

相关文章
相关标签/搜索