我想有过vue开发经验的,对于vue.use并不陌生。当使用vue-resource或vue-router等全局组件时,必须通过Vue.use方法引入,才起作用。那么vue.use在组件引入之前到底做了那些事情呢?让我们一窥究竟。

先上vue.use源码
// javascript的方法是可以传递的,哈哈
Vue.use = function (plugin) {
/* istanbul ignore if */
if (plugin.installed) {
return
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
plugin.installed = true;
return this
};
假设我们通过Vue.use引入一个插件plugin(该插件可以暂时理解为一个变量或参数),即Vue.use(plugin);
首先判断传入的参数plugin的属性installed是否存在,如果存在且逻辑值为真,那么直接返回,后边的代码就不会再执行,这个判断的作用是什么呢?后边会讲到。
我们先假设plugin的属性installed不存在或为假,那么继续往下执行。
var args = toArray(arguments, 1);
//执行了一个toArray方法,toArray接收了两个参数,arguments为Vue.use方法传入的参数集合,例如Vue.use(a,b,c),那么arguments类似于[a,b,c](说明:arguments只是类数组,并不是真正的数组)。此处因为只引入一个参数plugin,所以arguments类似于[plugin]。
toArray的作用是什么呢?看源码。
function toArray (list, start){
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret
}
当执行toArray(arguments,1),会生成一个新数组ret,长度 = arguments.length-1,然后进行while循环,依次倒序把arguments的元素赋值给ret,因为ret比arguments长度少1,所以最终等同于arguments把除了第一个元素外的其余元素赋值给ret。toArray主要作用就是把类数组转化为真正的数组,这样才能调用数组的方法。因为此处我只引入一个plugin参数,即arguments=[plugin],所以toArray返回为空数组[]。
接着往下执行,args.unshift(this),等同于[].unshift(Vue),即args = [Vue];然后执行
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
此处判断plugin的install是否为函数,如果为函数,立即执行pluign.install方法,install方法传入的参数为args内数组元素,即install接受的第一个参数为Vue.
如果plugin的install不是函数,那么判断plugin本身是否为函数,如果为函数,那么执行plugin函数,且参数为args内数组元素。
最后设置plugin.installed为true。设置plugin.installed为true的作用是避免同一个插件多次执行安装,比如Vue.use(plugin)执行一次之后,installed为true,再次执行的话走到第一步判断就返回了。
综上所述,Vue.use的作用其实就是执行一个plugin函数或者执行pluign的install方法进行插件注册,并且向plugin或其install方法传入Vue对象作为第一个参数,use的其他参数作为plugin或install的其他参数。
举个简单的例子
import Vue from 'vue'
function test(a){
console.log(a);//Vue
}
function test1(a,b){
console.log(a,b);//Vue hello
}
let oTest = {
install:function(a,b){
console.log(a,b);//Vue hello1
}
}
Vue.use(test);
Vue.use(test1,'hello');
Vue.use(oTest,'hello1');
console.log(oTest);
//{
install:function(){...},
installed:true
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue
# Vue.use
# 详解Vue.use自定义自己的全局组件
# 浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
# axios基本入门用法教程
# axios学习教程全攻略
# vue axios用法教程详解
# vue-axios使用详解
# 关于axios不能使用Vue.use()浅析
# 第一个
# 什么呢
# 往下
# 类似于
# 我想
# 让我们
# 走到
# 就不
# 我只
# 有过
# 不存在
# 转化为
# 会再
# 讲到
# 值为
# 大家多多
# 或其
# 是否存在
# 举个
# 为空
相关文章:
制作国外网站的软件,国外有哪些比较优质的网站推荐?
建站之星后台管理:高效配置与模板优化提升用户体验
浅析上传头像示例及其注意事项
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
红河网站制作公司,红河事业单位身份证如何上传?
网站制作难吗安全吗,做一个网站需要多久时间?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
开心动漫网站制作软件下载,十分开心动画为何停播?
广德云建站网站建设方案与建站流程优化指南
宝塔新建站点为何无法访问?如何排查?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在建站之星网店版论坛获取技术支持?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何在服务器上配置二级域名建站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何通过免费商城建站系统源码自定义网站主题与功能?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何通过老薛主机一键快速建站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何在Tomcat中配置并部署网站项目?
如何选择适合PHP云建站的开源框架?
建站之星3.0如何解决常见操作问题?
临沂网站制作公司有哪些,临沂第四中学官网?
建站之星导航如何优化提升用户体验?
公司网站的制作公司,企业网站制作基本流程有哪些?
如何用PHP快速搭建CMS系统?
怎么将XML数据可视化 D3.js加载XML
如何在宝塔面板中创建新站点?
如何注册花生壳免费域名并搭建个人网站?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何快速上传自定义模板至建站之星?
如何在橙子建站上传落地页?操作指南详解
如何快速生成专业多端适配建站电话?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何通过建站之星自助学习解决操作问题?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
香港服务器WordPress建站指南:SEO优化与高效部署策略
盐城做公司网站,江苏电子版退休证办理流程?
如何配置支付宝与微信支付功能?
如何正确下载安装西数主机建站助手?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
,sp开头的版面叫什么?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
智能起名网站制作软件有哪些,制作logo的软件?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
html制作网站的步骤有哪些,iapp如何添加网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。