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 相关文章推荐
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
node.js中的emitter.on方法使用说明
Dec 10 Javascript
angularjs 处理多个异步请求方法汇总
Jan 06 Javascript
基于原生JS实现图片裁剪
Aug 01 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 Javascript
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 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中autoload的用法总结
2013/11/08 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
2018/05/15 NodeJs
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
python实现FTP服务器服务的方法
2017/04/11 Python
Python网络编程详解
2017/10/31 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
django settings.py 配置文件及介绍
2019/07/15 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
会计主管岗位职责
2014/01/03 职场文书
趣味游戏活动方案
2014/02/07 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
困难补助申请报告
2015/05/19 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python