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 相关文章推荐
ExtJS4中的requires使用方法示例介绍
Dec 03 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
May 14 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
JavaScript ParseFloat()方法
Dec 18 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
Mar 01 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
详解node nvm进行node多版本管理
Oct 21 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 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
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php使用正则验证中文
2016/04/06 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
js中作用域的实例解析
2017/03/16 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python标准异常和异常处理详解
2015/02/02 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
基于python中theano库的线性回归
2018/08/31 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Django如何实现上传图片功能
2019/08/16 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
django 读取图片到页面实例
2020/03/27 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
给酒店员工的表扬信
2014/01/11 职场文书
护士自我评价范文
2014/01/25 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
安全生产年活动总结
2014/08/29 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
python实现简单的三子棋游戏
2022/04/28 Python