一、为什么要自己动手写插件呢,原因有二:

  其一:是因为最近产品了提了一个在web端接收,消息通知的需求,产品要求在若干个页面内如果有消息,就要弹出消息弹窗展示给用户,略加思索之后,第一反应就是写个消息的组件,在需要的页面引入,不过写好之后,发现这样写好麻烦,是不是可以写个插件在全局一次性引入呢?

  其二:纯粹的想学习一下vue的插件是如何开发的

二、既然有想法了,那就开始写呗,先去查看了vue的官方文档,官方文档介绍如下:

插件通常用于为 Vue 添加全局级别的功能。然而对于插件,并没有严格限定其使用范围 - 下面是常见的几种插件类型:

  1. 添加一些全局方法或属性。

  2. 添加一个或多个全局资源(asset):指令(directives)/过滤器(filters)/过渡(transitions) 等。

  3. 通过全局 mixin,添加一些组件选项。

  4. 添加一些 Vue 实例方法,通过把这些方法添加到 Vue.prototype 上实现。

  5. 一个可以提供 API 的库(library),与此同时也是以上功能的组合。

Vue.js 插件应该暴露一个 install 方法。此方法在调用时,将 Vue 构造函数作为第一个参数传入,以及将一个可选的选项作为第二个参数传入:

 MyPlugin.install = function (Vue, options) {
// 1. 添加全局方法或属性
Vue.myGlobalMethod = function () {
// 一些逻辑……
} // 2. 添加一个全局资源(asset)
Vue.directive('my-directive', {
bind (el, binding, vnode, oldVnode) {
// 一些逻辑……
}
...
}) // 3. 注入一些组件选项
Vue.mixin({
created: function () {
// 一些逻辑……
}
...
}) // 4. 添加一个实例方法
Vue.prototype.$myMethod = function (methodOptions) {
// 一些逻辑……
}
}
 通过调用全局方法 Vue.use() 使用插件:

 // 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)
可以根据情况,传入一些可选的选项: Vue.use(MyPlugin, { someOption: true })
Vue.use 会自动阻止多次使用同一个插件,所以对于同一个插件的多次调用,将只安装一次。

三、看完文档我们就开始动手写呗(以loading插件为例)

 var Loading = {}
var showLoad = false
var loadNode = {}
Loading.install = function (Vue, options) {
Vue.prototype.$loading = function (type) {
if (type === 'close') {
loadNode.show = showLoad = false
document.querySelector('.loadEffect').remove()
} else {
if (showLoad) {
return
}
let LoadingTpl = Vue.extend({
data: function () {
return {
show: showLoad
}
},
template: `<div class="loadEffect"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><p class="loadings">loading....</p></div>
`
})
let tpl = new LoadingTpl().$mount().$el
document.body.appendChild(tpl)
loadNode.show = showLoad = true;
['open', 'close'].forEach(function (type) {
Vue.prototype.$loading[type] = function () {
return Vue.prototype.$loading(type)
}
})
}
}
} export default Loading
import { Loading} from './Plugins/index'
 Vue.use(Loading)

然后在我们的组件中使用this.$loading来使用,发现没有任何问题。。。。。

但是。。。嘿嘿,总有但是,,没错下面的场景就是万恶的但是。。。。

因为我们发现我们编写的这个插件只能在vue组件中使用,如果我想在axios的拦截器中使用这个插件呢?显然用不了,这是为什么呢?是因为我们在axios中没有访问到vue的实例,因为我们的插件是过载在vue的实例上的

现在怎么办,百度看了很多别人写的博客,不出意外,对就是那个不出意外,没有找到合适的解决方案!!!!!!!!!!!!!!!!!

怎么办呢?放弃?不可能,这辈子是不可能放弃的!!!下辈子也不可能的!!!那怎么办?嘿嘿,世面上还是有很多牛叉的UI库的比如element-ui,然后自己去试了一下,发现element-ui不仅在vue组件中可以使用,也可以在axios的拦截器这中调用

既然发现了,那就去查看他们的源码,看看大佬们是如何实现的,不看不知道,一看吓一跳,老大的代码果然性感,下面贴出我自己删减后实现这个功能的核心代码

 const Message = function (options) {
options = options || {}
options = {
message: options.message,
name: options.name,
state: options.state
}
instance = new MessageConstructor({
data: options
})
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
}
Vue.prototype.$message = Message

下面贴出源码地址

https://github.com/songdongdong123/vue-message-Plugins

如果对您有帮助不要吝啬您的start

自己动手编写vue插件的更多相关文章

  1. 【Vue】---编写Vue插件流程---【巷子】

    一.在Vue中编写插件流程 1.创建组件 components/message.vue <template> <div class="message" v-if= ...

  2. 自己动手写Vue插件Toast

    <style> .vue-toast { width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; backgrou ...

  3. vue插件编写与实战

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 热爱vue开发的同学肯定知道awesome-vue 这个github地址,里面包含了数以千计的vue ...

  4. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  5. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  6. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  7. 自己动手编写一个VS插件(七)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...

  8. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  9. 【babel+小程序】记“编写babel插件”与“通过语法解析替换小程序路由表”的经历

    话不多说先上图,简要说明一下干了些什么事.图可能太模糊,可以点svg看看 背景 最近公司开展了小程序的业务,派我去负责这一块的业务,其中需要处理的一个问题是接入我们web开发的传统架构--模块化开发. ...

随机推荐

  1. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  2. JS复制文件(转)

    <script type="text/javascript"> var fso, f; function copyFile() { fso = new ActiveXO ...

  3. redis在linux安装和开机启动和结合php运用方法一

    第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: 1 2 3 4 5 6 ...

  4. 9i 和 11 g 区别

    9i 和 11 g 区别 9i 不支持 2/4/8G,只支持 2000/4000/8000 M的

  5. js实现左右点击图片层叠滚动特效

    需要加载js有 <script type="text/javascript" src="js/jquery-1.7.2.min.js"></s ...

  6. 实现div左右上下都居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [ SPOJ PT07J ] Query on a tree III

    \(\\\) Description 其实这题才是正版的 Qtree3...... 给定 \(n\) 个点,以 \(1\) 号节点为根的树,点有点权. \(m\) 次询问 以 \(x\) 为根的子树内 ...

  8. JavaScript(十)基本包装类

    基本包装类都具有对象的基本方法     toString   和 valueOf Number 数字是原始类型,那为啥还有方法? 因为他在执行方法的时候会创建一个对应的包装类对象,这个对象有这种方法, ...

  9. FTP初始化文件.netrc使用技巧[转发]

    FTP初始化文件.netrc使用技巧 FTP(文件传输)和E-mail(电子邮件).Telnet(远程登录)一样,是 Internet的三大主要功能之一.因为使用频繁,用户往往会遇到各种 各样的问题, ...

  10. Selenium IDE的第一个测试用例——路漫长。。。

    一周时间过去了,断断续续学习selenium也有几个小时了:今天细想一下学习效率不高的原因在哪,总结出以下几点: 1.求“进”心切——总想一步到位,搭建好环境,开始动手写用例. 2.学习深度不够——同 ...