start
- 前几天使用了一个别人封装的电子签名组件:vueEsign。
- 在初始化的时候有这么一行代码:
Vue.use(vueEsign) - 之前使用element-ui,也需要使用
Vue.use() - 这行代码到底是什么?学习一下。
本文所有演示内容,vue.js版本为2.6.14
1. Vue.use是什么,了解一下!?
1.1 main.js 中的Vue.use()
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import vueEsign from 'vue-esign'
Vue.use(vueEsign)
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
1.2 简单解释一下这里的import 的逻辑,
- 如果
from 后面是路径,直接沿路径去寻找对应文件。 - 如果
from 后面是一个名称,那就引入是第三方模块,会去node_modules 中寻找对应名称的文件夹。
node_modules 》 package.json 》 main属性
1.3 Vue.use()代码
找到对应文件
对应代码
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
var 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);
}
installedPlugins.push(plugin);
return this
};
}
2. 看一下 vueEsign 插件的install是什么?
node_modules\vue-esign\src\idnex.js
import vueEsign from './index.vue'
vueEsign.install = function (Vue) {
if (this.installed) {
return
}
this.installed = true
Vue.component('vueEsign', vueEsign)
}
export default vueEsign
3.看一下 element-ui的install是什么?
node_modules\element-ui\src\index.js
const install = function(Vue, opts = {}) {
locale.use(opts.locale);
locale.i18n(opts.i18n);
components.forEach(component => {
Vue.component(component.name, component);
});
Vue.use(InfiniteScroll);
Vue.use(Loading.directive);
Vue.prototype.$ELEMENT = {
size: opts.size || '',
zIndex: opts.zIndex || 2000
};
Vue.prototype.$loading = Loading.service;
Vue.prototype.$msgbox = MessageBox;
Vue.prototype.$alert = MessageBox.alert;
Vue.prototype.$confirm = MessageBox.confirm;
Vue.prototype.$prompt = MessageBox.prompt;
Vue.prototype.$notify = Notification;
Vue.prototype.$message = Message;
};
4. Vue.use() 总结
-
首先 Vue.use 本身是一个函数; -
Vue.use 这个函数做了这些操作:
- 判断插件是否注册;
- 如果插件自带insatll属性,执行它,同时传递一个Vue构造函数作为第一个参数,以及use中的其他参数;
- 如果插件本身就是函数,执行它,同时传递一个Vue构造函数作为第一个参数,以及use中的其他参数
- 记录这个插件已经注册;
-
暂时遇到的插件本身都是一个对象,然后install中都会拿到传递来的Vue构造函数进行一些绑定操作。例如绑定组件,例如在原型上添加方法。
5.为什么有的库就不需要使用Vue.use
例如常见的aixos引入
import axios from 'axios'
Vue.prototype.$axios=axios
axios本身是不依赖Vue去运行的,axios本身就可以在浏览器端或者node端都能进行http请求。
这里挂载到Vue原型的$axios属性上,只是为了方便使用。
end
- 感觉就是
组件 需要和 Vue构造函数 进行交互的时候,才需要Vue.use()。 - 本质就是传递一个 Vue构造函数 给插件使用,仅此而已。
|