github地址
最近几个月来我司把公司之前两三年的所以业务都用了vue重构了一遍,前台使用了vue+ssr,后台使用了vue+element,在此过程中包装和自己写了很多的vue component。其实vue 写component相当方便和简单的,github上有很多的vue component都只是简单的包装了一些jquery或者原生js的插件,但我个人是不太喜欢使用这些第三方封装的。理由如下:
所以我觉得大部分组件还是自己封装来的更方便和灵活一些。
接下来就来手把手教你如何改造包装一个js插件,只要几分钟就可以封装一个属于你的vue component。封装对象:countUp.js,改造后结果vue-countTo
首先我们用官方提供的vue-cli 来构建项目 这里选择了webpack-simple(组件比较简单,webpack-simple已经满足需求了)
$ npm install -g vue-cli
$ vue init webpack-simple my-project
$ cd my-project
$ npm install
安装countup.js
$ npm install countup.js
$ npm run dev
启动项目之后按照countup.js官方demo初始化插件
<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已经生效了。
接下来查看countUp.js github发现它定义了如下可配置项目
对应vue就是props,类型和初始化一目了然。
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
);
使用组件
"myCounter" :end="2500" :duration="2.5" :options="{useEasing : true,
useGrouping : true,
separator : ',',
decimal : '.',
prefix : '',
suffix : ''}">
只要几分钟一个属于自己的原生组件就包装好了,就是这么简单。完整demo
这时候你如果觉得使用countUp.js 还有些不满足你的需求,那你可以选择自己来造轮子了。
首先当然是阅读源码源码了
其实源码也就两部分核心代码
第一部分主要是就是requestAnimationFrame,在游览器不支持requestAnimationFrame的情况下使用setTimeout来模拟,这段代码指的仔细阅读,自己平时的一些项目中也能借鉴使用。
第二部分就是count函数
看懂这两部分之后造轮子就相当的简单了,demo
造轮子过程中发现countUp,并没有autoplayt这个参数项可以自动count,没事。。。我们可以自己来撸,我们首先定义autoplay这个props为布尔值,默认所有组件autoplay为true
props:{
autoplay: {
type: Boolean,
required: false,
default: true
}
}
定义好props之后在mounted生命周期内加一个判断就完事。
mounted() {
if (this.autoplay) {
this.start();
}
}
我们的countUp组件可以自动count了!
在不跨项目的情况下之前说的已经满足需求了。这时候我说不,我想让世界上更多的人来使用我的东西,这时候就要上传NPM了。我们这里就要开始改一些配置项了。demo
我们新建一个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的
很多人是通过
library: 'CountTo',
libraryTarget: 'umd',
umdNamedDefine: true
大功告成,现在只要发布到npm就可以了,首先注册一个npm
之后配置自己的package.json(注意填写version,每次发布的version不能相同;main为入口文件地址)
之后只要一个npm publish 你的项目就发到npm了,快让小伙伴们一起来用你的vue component吧!
这里这是拿了一个很简单的countUp组件举了一个例子,有时候自己动手丰衣足食,很多项目自己封装比想象中简单的多。产品经理再也不会看到我因为这个fuc咳插件怎么不支持这个功能而愁眉苦脸了,我们可以更好地满足产品了~~
完整项目地址: https://github.com/PanJiaChen/vue-countTo 欢迎star
本人在公司也用vue写了一个几十个页面,十几种权限,各不同功能的后台项目,准备开源有两步登录,权限验证,错误上报,在线换肤,拖拽排序,富文本,markdown,jsonEditor,dropzone,七牛直传(打水印),图表,dashboard,splitPan,StickyHeader,个人中心,头像上传。。。等等只有想不到没有没做到的业务场景。(vue+element+社区插件,一个人撸毫无压力)
占坑项目地址