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的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
深入理解React高阶组件
Sep 28 Javascript
JS判断数组那点事
Oct 10 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
Dec 01 Javascript
JS中利用FileReader实现上传图片前本地预览功能
Mar 02 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
vue中导出Excel表格的实现代码
Oct 18 Javascript
js实现网页同时进行多个倒计时功能
Feb 25 Javascript
如何正确理解vue中的key详解
Nov 02 Javascript
记一次react前端项目打包优化的方法
Mar 30 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 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
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
解读ES6中class关键字
2017/11/20 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
python写的ARP攻击代码实例
2014/06/04 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
keras打印loss对权重的导数方式
2020/06/10 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
购房个人委托书范本
2014/10/11 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
消防验收申请报告
2015/05/15 职场文书
最美乡村教师观后感
2015/06/11 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP