Vue.js 插件开发详解


Posted in Javascript onMarch 29, 2017

前言

随着 Vue.js 越来越火,Vue.js 的相关插件也在不断的被贡献出来,数不胜数。比如官方推荐的 vue-router、vuex 等,都是非常优秀的插件。但是我们更多的人还只停留在使用的阶段,比较少自己开发。所以接下来会通过一个简单的 vue-toast 插件,来了解掌握插件的开发和使用。

认识插件

想要开发插件,先要认识一个插件是什么样子的。

Vue.js 的插件应当有一个公开方法 install 。这个方法的第一个参数是 Vue 构造器 , 第二个参数是一个可选的选项对象:

MyPlugin.install = function (Vue, options) {
 Vue.myGlobalMethod = function () { // 1. 添加全局方法或属性,如: vue-custom-element
 // 逻辑...
 }
 Vue.directive('my-directive', { // 2. 添加全局资源:指令/过滤器/过渡等,如 vue-touch
 bind (el, binding, vnode, oldVnode) {
 // 逻辑...
 }
 ...
 })
 Vue.mixin({
 created: function () { // 3. 通过全局 mixin方法添加一些组件选项,如: vuex
 // 逻辑...
 }
 ...
 })
 Vue.prototype.$myMethod = function (options) { // 4. 添加实例方法,通过把它们添加到 Vue.prototype 上实现
 // 逻辑...
 }
}

接下来要讲到的 vue-toast 插件则是通过添加实例方法实现的。我们先来看个小例子。先新建个js文件来编写插件:toast.js

// toast.js
var Toast = {};
Toast.install = function (Vue, options) {
 Vue.prototype.$msg = 'Hello World';
}
module.exports = Toast;

在 main.js 中,需要导入 toast.js 并且通过全局方法 Vue.use() 来使用插件:

// main.js
import Vue from 'vue';
import Toast from './toast.js';
Vue.use(Toast);

然后,我们在组件中来获取该插件定义的 $msg 属性。

// App.vue
export default {
 mounted(){
 console.log(this.$msg);  // Hello World
 }
}

可以看到,控制台成功的打印出了 Hello World 。既然 $msg 能获取到,那么我们就可以来实现我们的 vue-toast 插件了。

开发 vue-toast

需求:在组件中通过调用 this.$toast('网络请求失败') 来弹出提示,默认在底部显示。可以通过调用 this.$toast.top() 或 this.$toast.center() 等方法来实现在不同位置显示。

整理一下思路,弹出提示的时候,我可以在 body 中添加一个 div 用来显示提示信息,不同的位置我通过添加不同的类名来定位,那就可以开始写了。

// toast.js
var Toast = {};
Toast.install = function (Vue, options) {
 Vue.prototype.$toast = (tips) => {
  let toastTpl = Vue.extend({  // 1、创建构造器,定义好提示信息的模板
   template: '<div class="vue-toast">' + tips + '</div>'
  });
  let tpl = new toastTpl().$mount().$el; // 2、创建实例,挂载到文档以后的地方
  document.body.appendChild(tpl);  // 3、把创建的实例添加到body中
  setTimeout(function () {  // 4、延迟2.5秒后移除该提示
   document.body.removeChild(tpl);
  }, 2500)
 }
}
module.exports = Toast;

好像很简单,我们就实现了 this.$toast() ,接下来显示不同位置。

// toast.js
['bottom', 'center', 'top'].forEach(type => {
 Vue.prototype.$toast[type] = (tips) => {
  return Vue.prototype.$toast(tips,type)
 }
})

这里把 type 传给 $toast 在该方法里进行不同位置的处理,上面说了通过添加不同的类名(toast-bottom、toast-top、toast-center)来实现,那 $toast 方法需要小小修改一下。

Vue.prototype.$toast = (tips,type) => {  // 添加 type 参数
 let toastTpl = Vue.extend({    // 模板添加位置类
  template: '<div class="vue-toast toast-'+ type +'">' + tips + '</div>'
 });
 ...
}

好像差不多了。但是如果我想默认在顶部显示,我每次都要调用 this.$toast.top() 好像就有点多余了,我能不能 this.$toast() 就直接在我想要的地方呢?还有我不想要 2.5s 后才消失呢?这时候注意到 Toast.install(Vue,options) 里的 options 参数,我们可以在 Vue.use() 通过 options 传进我们想要的参数。最后修改插件如下:

var Toast = {};
Toast.install = function (Vue, options) {
 let opt = {
  defaultType:'bottom', // 默认显示位置
  duration:'2500'   // 持续时间
 }
 for(let property in options){
  opt[property] = options[property]; // 使用 options 的配置
 }
 Vue.prototype.$toast = (tips,type) => {
  if(type){
   opt.defaultType = type;   // 如果有传type,位置则设为该type
  }
  if(document.getElementsByClassName('vue-toast').length){
   // 如果toast还在,则不再执行
   return;
  }
  let toastTpl = Vue.extend({
   template: '<div class="vue-toast toast-'+opt.defaultType+'">' + tips + '</div>'
  });
  let tpl = new toastTpl().$mount().$el;
  document.body.appendChild(tpl);
  setTimeout(function () {
   document.body.removeChild(tpl);
  }, opt.duration)
 }
 ['bottom', 'center', 'top'].forEach(type => {
  Vue.prototype.$toast[type] = (tips) => {
   return Vue.prototype.$toast(tips,type)
  }
 })
}
module.exports = Toast;

这样子一个简单的 vue 插件就实现了,并且可以通过 npm 打包发布,下次就可以使用 npm install 来安装了。

源码地址:vue-toast

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
JavaScript判断变量是对象还是数组的方法
Aug 28 Javascript
javascript实现可键盘控制的抽奖系统
Mar 10 Javascript
JS常用字符串方法(推荐)
Jan 15 Javascript
Vue.js仿Metronic高级表格(一)静态设计
Apr 17 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
Dec 10 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
JQuery属性操作与循环用法示例
May 15 jQuery
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
Jun 10 Javascript
详解微信小程序之提高应用速度小技巧
Jan 07 Javascript
JavaScript 常见的继承方式汇总
Sep 17 Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 #Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 #Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 #Javascript
jQuery插件之validation插件
Mar 29 #jQuery
Vue.js实现移动端短信验证码功能
Mar 29 #Javascript
Angular2入门--架构总览
Mar 29 #Javascript
整理关于Bootstrap表单的慕课笔记
Mar 29 #Javascript
You might like
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
python3.7.0的安装步骤
2018/08/27 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
Django如何实现上传图片功能
2019/08/16 Python
django项目中新增app的2种实现方法
2020/04/01 Python
python3中数组逆序输出方法
2020/12/01 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
《最大的“书”》教学反思
2014/02/14 职场文书
医院标语大全
2014/06/23 职场文书
七一党日活动总结
2014/07/08 职场文书
求职自我评价范文100字
2014/09/23 职场文书
承诺函格式模板
2015/01/21 职场文书
教师辞职信范文
2015/02/28 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
离婚律师函范本
2015/05/27 职场文书
十月围城观后感
2015/06/08 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
演讲比赛主持词
2015/06/29 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python