前言
❤️文章最后有福利哦!
使用过 Vue
的童鞋都见过这个 Vue.use()
的方法,但是有没有想过为什么这个方法需要这个方法来使用插件呢? 官方 介绍有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
会自动阻止多次注册相同插件,届时即使多次调用也只会注册一次该插件。
源码
![95f7cdab52246818f0821829a3ffac86.png](https://i-blog.csdnimg.cn/blog_migrate/898d53e738e941a5927e9e91e93c77b6.png)
解读源码
![d531b3bf3c40a1038827d8f2df47926e.png](https://i-blog.csdnimg.cn/blog_migrate/3cea97ba316ca4d604cb0cef152c2bfd.png)
这里的参数 plugin
是指的是我们的 插件
,比如 ElementUI
, Router
等,首先需要指出的是这里的 this
是 Vue
构造器如下图:
![5fe60d999dc2231bb6d0316388aee586.png](https://i-blog.csdnimg.cn/blog_migrate/053640b227a3130c78776f2c7479ff2d.png)
通过定义_installedPlugins
对象如果之前注册过取之前注册过的_installedPlugins
,否则是空数组。判断这个插件是否存在installedPlugins
里面,如果存在结束,这就是为什么多次调用同一插件,插件只会注册一次
的原因。如果不存在,我们需要把他push
进去,这里再push
之前做了参数
处理。因为在使用Vue.use()
的时候可以传入可选的选项对象
。toArray
方法的作用是把类似数组的对象转化成真正的数组,源码如下图:
![c9080c0b63341f4990560bc6dde1beac.png](https://i-blog.csdnimg.cn/blog_migrate/a4752b229d8fafef950f52768f768708.png)
可能有人不明白为什么叫类似数组的对象呢?我们需要搞清楚 arguments 参数定义。 arguments
是一个对应于传递给函数的参数的类数组对象。
![5493a1e45472392744e40a02221ac77f.png](https://i-blog.csdnimg.cn/blog_migrate/16583b842c51d5603c23da447ad759c3.png)
args.unshift(this)
向前添加this
到args
, 为什么要把这个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实例
上。
![6b146ae9625193fbd2eceb365585fd84.png](https://i-blog.csdnimg.cn/blog_migrate/988dc5b364d00078426b4598481bf1c9.png)
然后我们通过 Vue.use(Plugin)
使用,可以在 new Vue()
之后直接在this直接上调用。
![617b7a839db10ad53a9ad72bea970228.png](https://i-blog.csdnimg.cn/blog_migrate/71885863bd2e5995034e588702dc714c.jpeg)
调用结果如下:
![935970f7d685bf7d2ba8635080b79a06.png](https://i-blog.csdnimg.cn/blog_migrate/2ee04318c4247fc69331d57571ce1d57.png)
如果本文对你有帮助的话可以点个『 赞』支持下哦 转发到您的朋友圈
作者:小丑同学
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
❤️福利
该怎么去面试大厂前端工程师?面试官都会这样问你?附答案www.jianshu.com![f57dc7c6abf256e41f22df96f2d9278c.png](https://i-blog.csdnimg.cn/blog_migrate/3efad6753e6b17618ec97847a56498d7.jpeg)