前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谈谈Vue.use的原理

谈谈Vue.use的原理

作者头像
小丑同学
发布2020-09-21 11:15:29
1.3K0
发布2020-09-21 11:15:29
举报

前言

使用过Vue的童鞋都见过这个Vue.use()的方法,但是有没有想过为什么这个方法需要这个方法来使用插件呢?官方[1]介绍有4中四种为Vue添加全局功能的方法:

1.添加全局方法或 property

Vue.myGlobalMethod = function () {
    // 逻辑...
  }

2. 添加全局资源

  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 逻辑...
    }
    ...
  })

3. 注入组件选项

  Vue.mixin({
    created: function () {
      // 逻辑...
    }
    ...
  })

4. 添加实例方法

 Vue.prototype.$myMethod = function (methodOptions) {
    // 逻辑...
  }

注意事项

  • 1.通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() 启动应用之前完成
  • 2.Vue.use 会自动阻止多次注册相同插件,届时即使多次调用也只会注册一次该插件。

源码

解读源码

这里的参数plugin是指的是我们的插件,比如ElementUI,Router等,首先需要指出的是这里的thisVue构造器如下图:

通过定义_installedPlugins对象如果之前注册过取之前注册过的_installedPlugins,否则是空数组。判断这个插件是否存在installedPlugins里面,如果存在结束,这就是为什么多次调用同一插件,插件只会注册一次的原因。如果不存在,我们需要把他push进去,这里再push之前做了参数处理。因为在使用Vue.use()的时候可以传入可选的选项对象toArray方法的作用是把类似数组的对象转化成真正的数组,源码如下图:

可能有人不明白为什么叫类似数组的对象呢? 我们需要搞清楚arguments[2]参数定义。arguments 是一个对应于传递给函数的参数的类数组对象。

  • args.unshift(this)向前添加thisargs,为什么要把这个this放到args的第一个位置上呢? 这个就和install的传递的参数有关系了,第一个参数是Vue构造器 第二个参数是一个可选的选项options
 if (typeof plugin.install === 'function') {     
   plugin.install.apply(plugin, args);   
 } else if (typeof plugin === 'function') {     
   plugin.apply(null, args);   }

这里可以看到参数plugin在封装的时候需要暴露一个install方法,或者自身是一个方法,不然是无法传递参数的

实战

新建plugin.js文件,创建install方法,我们把clown方法挂在vue实例上。

然后我们通过Vue.use(Plugin)使用,可以在new Vue()之后直接在this直接上调用。

调用结果如下:

参考资料

[1]Vue之插件: https://cn.vuejs.org/v2/guide/plugins.html

[2]arguments: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小丑的小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 源码
  • 解读源码
  • 实战
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档