手把手带你封装一个vue component第三方库


Posted in Javascript onFebruary 14, 2019

为什么选择自己封装第三方库

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

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

所以我觉得大部分组件还是自己封装来的更为方便和灵活一些。

动手开干

接下来我们一起手摸手教改造包装一个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 初始化插件

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 已经生效了。

手把手带你封装一个vue component第三方库

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

手把手带你封装一个vue component第三方库

对应 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)

使用组件

<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 了!

手把手带你封装一个vue component第三方库

上传 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)
}

同时我们也要改造一下 webpack 的配置,因为不是所有使用你组件的人都是通过 npm 安装使用 import 引入组件的的。

还有很多人是通过 <script> 标签的方式直接引入的,所以我们要将 libraryTarget 改为 umd 格式

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

大功告成,现在只要将它发布到 npm 就可以了,首先注册一个npm 账号,

之后配置自己的 package.json (注意填写 version,每次发布的 version 不能相同;main 为入口文件地址)。

之后只要一行命令 npm publish 你的项目就发到 npm 了,快让小伙伴们一起来用你的vue component 吧!

手把手带你封装一个vue component第三方库

总结

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

完整项目地址:vue-element-admin

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JSQL 批量图片切换的实现代码
May 05 Javascript
jquery垂直公告滚动实现代码
Dec 08 Javascript
Extjs grid添加一个图片状态或者按钮的方法
Apr 03 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
Jun 14 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
May 02 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
关于jquery中attr()和prop()方法的区别
May 28 jQuery
jQuery实现简单的Ajax调用功能示例
Feb 15 jQuery
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
Nov 24 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
微信小程序实现简单表格
Feb 14 #Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 #Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
Feb 14 #jQuery
vue中各种通信传值方式总结
Feb 14 #Javascript
微信小程序实现banner图轮播效果
Jun 28 #Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 #Javascript
JavaScript类型相关的常用操作总结
Feb 14 #Javascript
You might like
关于PHP定时发送服务的解决办法
2017/04/23 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
详解Python中for循环的使用
2015/04/14 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
python温度转换华氏温度实现代码
2020/12/06 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
个人公开承诺书
2014/03/28 职场文书
股权投资意向书
2014/04/01 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
工作散漫检讨书
2014/09/16 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
万能检讨书2000字
2014/10/17 职场文书
优秀教师申报材料
2014/12/16 职场文书