手把手教你封装一个vue component

来源:互联网 发布:软件驻场开发 编辑:程序博客网 时间:2024/06/05 05:21

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


github地址 
最近几个月来我司把公司之前两三年的所以业务都用了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
  • 1
  • 2
  • 3
  • 4

安装countup.js

$ npm install countup.js$ npm run dev
  • 1
  • 2

启动项目之后按照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

刷新页面,就这么简单,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

之后再将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

使用组件

<vuecountup class="myCounter" :end="2500" :duration="2.5" :options="{useEasing : true,            useGrouping : true,            separator : ',',            decimal : '.',            prefix : '',            suffix : ''}"></vuecountup>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

只要几分钟一个属于自己的原生组件就包装好了,就是这么简单。完整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

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

mounted() {    if (this.autoplay) {      this.start();    }  }
  • 1
  • 2
  • 3
  • 4
  • 5

我们的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

我们也要改造一下webpack,因为不是所有使用你组件的人都是通过npm按住和import的 
很多人是通过

        library: 'CountTo',        libraryTarget: 'umd',        umdNamedDefine: true
  • 1
  • 2
  • 3
  • 4
  • 5

大功告成,现在只要发布到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

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一周岁宝宝不爱吃饭怎么办 两岁半宝宝不自己吃饭怎么办 3岁宝宝不会吃饭怎么办 节食减肥胃疼怎么办呢 减肥不吃饭胃疼怎么办 过度节食伤了胃怎么办 3岁宝宝啥也不吃怎么办 1岁多宝宝不吃饭怎么办 胃口吃辣的难受怎么办 空腹吃辣椒胃疼怎么办 吃东西辣的胃口疼怎么办 吃辣的东西胃烧怎么办 吃母乳的宝宝不爱喝水怎么办 三个月宝宝不肯吃奶粉怎么办 三个月宝宝不肯喝奶粉怎么办 三个月的宝宝不肯喝奶粉怎么办 三个月的宝宝不肯吃奶粉怎么办 饿了还是没食欲怎么办 3岁半幼儿便秘怎么办 小孩字写得难看怎么办 小孩的字写的丑怎么办 小孩字写的太差怎么办 小孩很多字不会写怎么办 食欲不好吃不多怎么办 中班小孩子子不肯写字怎么办 1岁宝便秘该怎么办 两周的宝宝便秘怎么办 3岁宝宝不肯吃药怎么办 1岁婴儿不肯吃药怎么办 9月婴儿不肯吃药怎么办 半岁宝宝不吃药怎么办 1岁宝宝不爱吃药怎么办 2岁吃多了呕吐怎么办啊 小孩吃撑了吐怎么办 三岁宝宝吃太多怎么办 小孩吃撑发烧了怎么办 婆婆不帮忙带孩子怎么办 孩子在中班幼儿园不爱写字怎么办 小孩不愿意上学不愿意写字怎么办 宝妈太内向不喜欢带孩子出门怎么办 宝宝吃饭不带围兜怎么办