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

  其一:是因为最近产品了提了一个在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

最新文章

  1. React Native学习笔记
  2. 用Broadcast广播在activity之间、fragment之间、activity和fragment之间相互传数据
  3. struts2学习笔记之八:Action中方法的动态调用
  4. jQuery插件开发总结
  5. jQuery获取同级元素
  6. Target host is not specified错误
  7. Ubuntu安装google chrome过程
  8. Python提取图片的ROI
  9. 【css3网页布局】flex盒子模型
  10. ListView 介绍
  11. Keras学习环境配置-GPU加速版(Ubuntu 16.04 + CUDA8.0 + cuDNN6.0 + Tensorflow)
  12. SQL语言(一)
  13. 使用RSA加密在Python中逆向shell
  14. python django基础二URL路由系统
  15. D - Wireless Network
  16. Maven学习笔记(十二)-maven打包之resource配置
  17. gridvew使用技巧2
  18. leetCode 题解之字符串中第一个不重复出现的字符
  19. [转帖]InfiniBand 主流厂商 和 产品分析
  20. 安装lsb_release

热门文章

  1. 什么是需求Bug、设计Bug、功能bug?
  2. JSP页面结构
  3. 最短路径(Dijkstra算法)
  4. POJ 2452 Sticks Problem (暴力或者rmq+二分)
  5. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形【叉积+极角排序+瞎搞】
  6. bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】
  7. 3-3 编程练习:jQuery键盘事件案例
  8. 修复mysql的表
  9. 洛谷P1010 幂次方
  10. C#和C++的区别(一)