Vue.use详解

295 阅读2分钟

Vue.use的使用

Vue.use是用来安装插件的,该方法需要在调用 new Vue() 之前被调用

Vue.use语法

Vue.use(plugin)

  • 如果插件是一个对象,必须提供 install 方法。
  • 如果插件是一个函数,它自己本身会被作为 install 方法,当外界在 Vue.use()安装这个插件的时候,install 方法会调用,然后会将 Vue 作为参数传入。

当 install 方法被同一个插件多次调用,插件将只会被安装一次,提供 install 方法,只是为了让 Vue 可以将组件注册到框架里去,使其能够被全局使用。

Vue中的use原理

export function initUse (Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    // 获取已经安装的插件
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    // 看看插件是否已经安装,如果安装了直接返回
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // toArray(arguments, 1)实现的功能就是,获取Vue.use(plugin,xx,xx)中的其他参数。
    // 比如 Vue.use(plugin,{size:'mini', theme:'black'}),就会回去到plugin意外的参数
    const args = toArray(arguments, 1)
    // 在参数中第一位插入Vue,从而保证第一个参数是Vue实例
    args.unshift(this)
    // 插件要么是一个函数,要么是一个对象(对象包含install方法)
    if (typeof plugin.install === 'function') {
      // 调用插件的install方法,并传入Vue实例
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    // 在已经安装的插件数组中,放进去
    installedPlugins.push(plugin)
    return this
  }
}

综上,Vue.use方法主要做了两件事:

1.检查插件是否安装,如果安装了就不再安装

2.如果没有安装,那么调用插件的install方法,并传入Vue实例

为什么在引入Vue-Router、Vuex、ElementUI的时候需要Vue.use()?而引入axios的时候,不需要Vue.use()?

Vue-Router、Vuex、ElementUI三者都具有install方法,并且插件的运行依赖于install方法里的一些操作,才能正常运行,而axios 内部并没有提供相应的组件供用户全局使用,开发者在封装 axios 时,根本就没有配置 install。