手把手带你封装一个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 相关文章推荐
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
微信小程序 wx.uploadFile无法上传解决办法
Dec 14 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
Oct 14 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
vue props传值失败 输出undefined的解决方法
Sep 11 Javascript
vue项目持久化存储数据的实现代码
Oct 01 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
如何在vue中使用jointjs过程解析
May 29 Javascript
vue如何批量引入组件、注册和使用详解
May 12 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
MYSQL环境变量设置方法
2007/01/15 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
详解Django CAS 解决方案
2019/10/30 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
在python中修改.properties文件的操作
2020/04/08 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
用Python 执行cmd命令
2020/12/18 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
《永远的白衣战士》教学反思
2014/04/25 职场文书
项目合作意向书模板
2014/07/29 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
2015国庆节宣传语
2015/07/14 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js