Vue.use源码分析


Posted in Javascript onApril 22, 2017

我想有过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
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
Oct 26 Javascript
es6 字符串String的扩展(实例讲解)
Aug 03 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
vue组件的写法汇总
Apr 12 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
Sep 05 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 Javascript
uploader秒传图片到服务器完整代码
Apr 22 #Javascript
Node.js中看JavaScript的引用
Apr 22 #Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 #Javascript
Ionic2调用本地SQlite实例
Apr 22 #Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 #Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 #Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 #Javascript
You might like
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
Python中多线程thread与threading的实现方法
2014/08/18 Python
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python get获取页面cookie代码实例
2018/09/12 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
《影子》教学反思
2014/02/21 职场文书
员工安全责任书范本
2014/07/24 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
2015年父亲节寄语
2015/03/23 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书