本文最后更新于 2024-11-11T03:04:04+00:00
越是让你感觉到害怕的事情,就越要去面对它。
什么是插件
Vue
的插件一般就是用来扩展Vue的功能。比如,当需要Vue
实现Ajax
请求功能,我们希望通过this.$get(url)
的形式就可以发送一个get
请求。那么,我们就需要给Vue
的实例添加一个$get
方法,Vue
实例本身是没有这个方法的。
Vue
的一些插件:
vuex
:官方状态管理插件;
vue-router
:官方路由插件;
vue-resource
:Ajax请求插件;
vue-element
:饿了么出品的组件库。
如何使用插件
在创建Vue
实例之前,通过全局方法Vue.use()
来使用插件:
1 2 3 4 5
| Vue.use(MyPlugin)
Vue.use(MyPlugin, options)
|
是不是很简单,好像也没有什么好说的。
有时候,我们看到某些插件使用起来可能有些不一样。比如使用vuex
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import Vuex from 'vuex' import Vue from 'vue' import state from './state' import mutations from './mutations' import actions from './actions'
Vue.use(Vuex)
const store = new Vuex.Store({ state, mutations, actions })
export default store
|
1 2 3 4 5 6 7 8 9 10
| import Vue form 'vue' import App from './App' import store from './store'
new Vue({ el: '#app', store, render: h => h(App) })
|
其实本质上还是一样的,也是通过Vue.use()
方法注册插件。只不过它有一个store
对象,然后并将store
对象作为Vue
根实例的属性,以便组件通过this.$store
这种形式来访问。
自定义插件
其实当通过Vue.use()
注册插件时,内部会自动调用插件的install()
方法。也就是说,插件必须要提供一个公开的install()
方法,作为接口。该方法第一个参数是Vue
,第二个参数是可选的options
对象。
总结起来说,插件是一个对象。该对象要有一个公开的install()
方法,那么写起来可能是这样的:
1 2 3 4 5 6
| const MyPlugin = {} MyPlugin.install = function (Vue, options) { }
export default MyPlugin
|
在install()
方法中,我们通过参数可以拿到Vue对象,那么,我们就可以对它做很多事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| MyPlugin.install = function (Vue, options) { Vue.myProperty = 'Hello Vue',
Vue.directive('name', function (el, binding) { })
Vue.mixin({ created () { } })
Vue.prototype.$get = function () { } }
|
插件的几种写法
这里直接就看几个插件的源码吧,看看他们是怎么写的,其实我也是参照了这些源码才真正弄明白了插件是怎么一回事。源码很长,这里只说一些关键点。
vue-touch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
;(function () { var vueTouch = {}
vueTouch.install = function (Vue) { }
if (typeof exports == "object") { module.exports = vueTouch } else if (typeof define == "function" && define.amd) { define([], function(){ return vueTouch }) } else if (window.Vue) { window.VueTouch = vueTouch Vue.use(vueTouch) } })()
|
vue-router
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { install } from './install'
export default class VueRouter { static install: () => void }
VueRouter.install = install
if (inBrowser && window.Vue) { window.Vue.use(VueRouter) }
|
vuex
1 2 3 4 5 6 7
| import { Store, install } from './store'
export default { install, }
|
vue-resource(重点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
function plugin(Vue) { if (plugin.installed) { return }
}
if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(plugin); }
export default plugin;
|
Vue.use源码解读(一点要看)
针对vue-resource
插件问题,我查看了一下vue
的源码,它的源码是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Vue.use = function (plugin: Function | Object) { if (plugin.installed) { return } const args = toArray(arguments, 1) args.unshift(this) if (typeof plugin.install === 'function') { plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') { plugin.apply(null, args) } plugin.installed = true return this }
|
通过源码,我们知道,Vue插件可以是一个对象或者是一个函数。只有当插件实现了 install
接口时(有install
这个函数时),才会调用插件的install
方法;否则再判断插件本身是否是一个函数,如果是,就直接调用它。
现在就能很好的解释vue-resource
插件的写法了。好吧,我也是刚刚得知,又长了一点见识。