Vue.use(plugin, arguments)
plugin(Function | Object)
插件的两种方式:
- 一种是对象,但是必须有一个install函数
- 一种是直接是函数暴露给Vue,当作install直接执行
源码分析:
- 先看这个组件是否注册过(不允许重复注册),注册过就直接返回this(Vue对象)
- 然后将arguments伪数组对象转为真正的数组,并且将参数数组的第一个参数即vue去除掉
- 没注册过就看如果有install方法,就调用plugin.install()方法,通过apply改变this为该plugin组件并传参arguments;
- 如果没有,就把plugin当作install,直接调用函数,此时plugin内的this为null
- 最后push到installedPlugins中,告知vue该插件已经被注册过,避免重复注册
function initUse(Vue) {
Vue.use = function (plugin) {
var installedPlugins = this._installedPlugins || (this._installedPlugins = []);
if (installedPlugins.indexOf(plugin) > -1) {
return this;
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (isFunction(plugin.install)) {
plugin.install.apply(plugin, args);
}
else if (isFunction(plugin)) {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this;
};
}
/**
* Convert an Array-like object to a real Array.
*/
function toArray(list, start) {
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret;
}