Vue.use源码分析

发布时间 - 2026-01-11 00:46:54    点击率:

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


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在服务器上三步完成建站并提升流量?  如何快速生成橙子建站落地页链接?  🚀拖拽式CMS建站能否实现高效与个性化并存?  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何实现API资源集合?(Resource Collection教程)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何在阿里云部署织梦网站?  用yum安装MySQLdb模块的步骤方法  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何使用模型观察者?(Observer代码示例)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel如何使用Service Container和依赖注入?(代码示例)  微信推文制作网站有哪些,怎么做微信推文,急?  node.js报错:Cannot find module 'ejs'的解决办法  javascript基于原型链的继承及call和apply函数用法分析  创业网站制作流程,创业网站可靠吗?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何彻底删除建站之星生成的Banner?  如何快速查询网站的真实建站时间?  如何用PHP快速搭建高效网站?分步指南  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  成都网站制作公司哪家好,四川省职工服务网是做什么用?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何快速搭建高效简练网站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何处理异常和错误?(Handler示例)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  深圳网站制作平台,深圳市做网站好的公司有哪些?  微信小程序 闭包写法详细介绍  Laravel如何配置任务调度?(Cron Job示例)  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在阿里云高效完成企业建站全流程?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel Fortify是什么,和Jetstream有什么关系  高防服务器租用如何选择配置与防御等级?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何用IIS7快速搭建并优化网站站点?  Swift开发中switch语句值绑定模式