手把手教你封装一个vue component
2017-11-29 17:51
381 查看
为什么选择自己封装第三方库
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 install1
2
3
4
[/code]
安装countup.js
$ npm install countup.js $ npm run dev1
2
[/code]
启动项目之后按照countup.js官方demo初始化插件
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>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[/code]
刷新页面,就这么简单,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 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[/code]
之后再将countup之前写死的参数项替换为动态props就可以了
this.numAnim = new CountUp(this.$refs.countup, this.start, this.end, this.decimal, this.duration, this.options );1
2
3
4
5
6
7
8
[/code]
使用组件
<vuecountup class="myCounter" :end="2500" :duration="2.5" :options="{useEasing : true, useGrouping : true, separator : ',', decimal : '.', prefix : '', suffix : ''}"></vuecountup>1
2
3
4
5
6
[/code]
只要几分钟一个属于自己的原生组件就包装好了,就是这么简单。完整demo (推荐打开此阅读代码)
这时候你如果觉得使用countUp.js 还有些不满足你的需求,那你可以选择自己来造轮子了。
造轮子篇
首先当然是阅读源码源码了其实源码也就两部分核心代码
第一部分主要是就是requestAnimationFrame,在游览器不支持requestAnimationFrame的情况下使用setTimeout来模拟,这段代码指的仔细阅读,自己平时的一些项目中也能借鉴使用。
第二部分就是count函数
看懂这两部分之后造轮子就相当的简单了,demo
造轮子过程中发现countUp,并没有autoplayt这个参数项可以自动count,没事。。。我们可以自己来撸,我们首先定义autoplay这个props为布尔值,默认所有组件autoplay为true
props:{ autoplay: { type: Boolean, required: false, default: true } }1
2
3
4
5
6
7
[/code]
定义好props之后在mounted生命周期内加一个判断就完事。
mounted() { if (this.autoplay) { this.start(); } }1
2
3
4
5
[/code]
我们的countUp组件可以自动count了!
上传NPM
在不跨项目的情况下之前说的已经满足需求了。这时候我说不,我想让世界上更多的人来使用我的东西,这时候就要上传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);1
2
3
4
5
6
7
8
[/code]
我们也要改造一下webpack,因为不是所有使用你组件的人都是通过npm按住和import的
很多人是通过
library: 'CountTo', libraryTarget: 'umd', umdNamedDefine: true1
2
3
4
5
[/code]
大功告成,现在只要发布到npm就可以了,首先注册一个npm
之后配置自己的package.json(注意填写version,每次发布的version不能相同;main为入口文件地址)
之后只要一个npm publish 你的项目就发到npm了,快让小伙伴们一起来用你的vue component吧!
总结
这里这是拿了一个很简单的countUp组件举了一个例子,有时候自己动手丰衣足食,很多项目自己封装比想象中简单的多。产品经理再也不会看到我因为这个fuc咳插件怎么不支持这个功能而愁眉苦脸了,我们可以更好地满足产品了~~完整项目地址: https://github.com/PanJiaChen/vue-countTo
转载:http://blog.csdn.net/u013193002/article/details/70214107
相关文章推荐
- 手把手教你封装一个vue component
- 如何封装一个vue component
- windows下封装一个soket服务器类(事件模型)
- 封装一个MongoDB的 asp.net 链接类
- iOS开发之带你5分钟封装一个时间轴
- JAVA--封装三角型 梯形 圆形三个类,用一个程序执行入口对三类对象进行测试
- 手把手做一个JSP入门程序(二):创建一个项目(JSP)
- C++——一个封装好的环形缓冲区
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- 通过模仿AsyncTask的封装方式,实现一个后台预读数据的线程,(使用AsyncTask有导致应用FC的风险)
- 用Docker封装一个web应用(Django)
- 介绍一个对IE控件封装最好的COM组件-csExWB
- C# 简单封装一个XML文件读取类
- 使用Swift的代理,闭包来封装一个公用协议减少垃圾代码
- GLUT的一个简明OO封装
- 拒绝无用功,封装一个通用的PopupWindow
- 10、对于JDK动态代理的一个简单封装ProxyUtil的使用
- C++封装一个简单的线程类
- 分享一个兼容多设备的蓝牙Lib框架封装思想(一)
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil