vue push 传递参数_谈谈Vue.use的原理

5741ee3600ac34dcab4421b73153cdcb.gif

前言

使用过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 会自动阻止多次注册相同插件,届时即使多次调用也只会注册一次该插件。

源码

808b813cb1c27f817f25d7fac7a1be48.png

解读源码

6d659d4886e6e24e47d12f4f66c95f5f.png

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

cddf4a32e5c883cf4a67a89c5ea95307.png

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

ba2f00e9abe9caf0a2a7a5d35b1183e5.png

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

efb137d066126899814fe7cde066cfba.png
  • 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实例上。

cb4a2296a2c36a54eded28c5f4894e3a.png

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

8c5ee25068080cf24ff86ee1faceff9a.png

调用结果如下:

32e5c5db30c301b66a1ab606ed26b0e4.png

・・・下期再见・・・

参考资料

[1]

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

[2]

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

75e517729ad34c6dd5d1134a2e6da78c.png

点击下面?[分享]、[赞]、[在看]是对小编最大的支持?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值