一、源码分析
用vue
插件时,我们会引入插件后,调用下Vue.use()
,如:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
为啥要执行下Vue.use()
呢?我们来看下Vue.use
源码
我们来看下vuex
的index.d.ts
,导出组件时的写法:
二、用法介绍
vue.use(plugin, arguments)
,参数:plugin(Function | Object)
说明:
-
vue
安装的组件类型必须为Function
或者是Object
- 若是
Object
,必须提供install
方法 - 若是
Function
,会被直接当作install
函数执行 -
install
函数接受参数,默认第一个参数为Vue
,其后参数为注册组件时传入的arguments
所以我们自己的插件封装方式一般都为Object
,提供install
方法,案例elementui2
如下:
import Cascader from './components/form/src/Cascader'
import Checkbox from './components/form/src/Checkbox'
import ColorPicker from './components/form/src/ColorPicker'
const components = {
Cascader,
Checkbox,
ColorPicker,
}
const install = function(Vue) {
Object.keys(components).forEach(key => {
Vue.component(key, components[key])
})
};
/* 支持使用标签的方式引入 */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
Object.assign(components, {
version: '1.0.1',
install
})
export default components
三、如上插件不调用use
可以吗
也是可以的。我们还是以上述
elementui2
为例:
我们用Vue.use(elementui2)
的时候,用的是对象中的install
;全局引入install函数
中注册过的组件;
- A. 若不需全局引入,具体某个页面需要用,且只需要引用其中某个或某几个组件,不需要
use
,用import
即可:
import { Cascader,Checkbox } from elementui2
components: { Cascader,Checkbox }
- B. 全局引入后,不用
use
可不可以呢?也可以啊,就是麻烦点呗,具体页面components
配置项配置下即可。
//我打包的时候,package.json中配置的name是eui
//main.js中全局引入
import eui from elementui2
//具体页面调用
let cmpts = { } //这里写页面单独引入的一些组件
//全部引入也可以: Object.assign(cmpts, eui2)
Object.assign(cmpts, {Cascader: eui.Cascader })
components: cmpts
四、没有install
函数的 js
库
像jquery
、axios
、js-cookie
等等,很多库,都没有install
函数,引入调用也不需要Vue.use
,来看下axios
的源码:
在需要的地方引入该js
库,调用对应的方法即可。
这种并非专门给vue
写的,更非组件,如axios
只是一个同时支持支持node
端和浏览器端的http
库。
网友评论