全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Vue.use源码分析

我想有过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()浅析  # 第一个  # 什么呢  # 往下  # 类似于  # 我想  # 让我们  # 走到  # 就不  # 我只  # 有过  # 不存在  # 转化为  # 会再  # 讲到  # 值为  # 大家多多  # 或其  # 是否存在  # 举个  # 为空 


相关文章: 网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  建站之星后台密码如何安全设置与找回?  建站主机选购指南:核心配置优化与品牌推荐方案  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何配置支付宝与微信支付功能?  如何快速查询网站的真实建站时间?  Python lxml的etree和ElementTree有什么区别  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何在建站主机中优化服务器配置?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何使用Golang table-driven基准测试_多组数据测量函数效率  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站之星如何快速更换网站模板?  免费网站制作appp,免费制作app哪个平台好?  大连网站制作公司哪家好一点,大连买房网站哪个好?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何在宝塔面板中修改默认建站目录?  小型网站建站如何选择虚拟主机?  北京专业网站制作设计师招聘,北京白云观官方网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  网站制作难吗安全吗,做一个网站需要多久时间?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  香港服务器选型指南:免备案配置与高效建站方案解析  建站之星3.0如何解决常见操作问题?  官网网站制作腾讯审核要多久,联想路由器newifi官网  历史网站制作软件,华为如何找回被删除的网站?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何通过虚拟主机快速完成网站搭建?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  婚礼视频制作网站,学习*后期制作的网站有哪些?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何快速生成凡客建站的专业级图册?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何在香港免费服务器上快速搭建网站?  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何用狗爹虚拟主机快速搭建网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何挑选优质建站一级代理提升网站排名?  家庭服务器如何搭建个人网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  ,巨量百应是干嘛的?  建站之星如何一键生成手机站?  如何零基础在云服务器搭建WordPress站点?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。