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 1.4 15个你应该知道的新特性(译)
Jan 24 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
js 通过cookie实现刷新不变化树形菜单
Oct 30 Javascript
第五章之BootStrap 栅格系统
Apr 25 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
基于JavaScript实现数码时钟效果
Mar 30 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
Jul 28 Javascript
vue移动端下拉刷新和上滑加载
Oct 27 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笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
详解Python中的__new__()方法的使用
2015/04/09 Python
python统计文本文件内单词数量的方法
2015/05/30 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
python-opencv颜色提取分割方法
2018/12/08 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python如何停止递归
2020/09/09 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
初入社会应届生求职信
2013/11/18 职场文书
2014年租房协议书范本
2014/10/30 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
解析MySQL索引的作用
2022/03/03 MySQL
带你了解Java中的ForkJoin
2022/04/28 Java/Android