Vue.use原理及源码解读
vue.use(plugin, arguments) 语法
- 参数:
plugin(Function | Object) - 用法:
如果vue安装的组件类型必须为Function或者是Object<br/>如果是个对象,必须提供install方法
如果是一个函数,会被直接当作
install函数执行install函数接受参数,默认第一个参数为Vue,其后参数为注册组件时传入的arguments 
组件.js
    export const testObj = {
        install(Vue, arg) {
        }
    }
    export const testFn = founction(Vue, arg) {
    }
index.js
    import { testObj, testFn } from './组建.js'
    Vue.use(testObj, arg)
    Vue.use(testFn, arg)
建议组件采用第一种写法,根据use源码,当采用第二种写法时,this指针指向null
    if (typeof plugin.install === 'function') {
          plugin.install.apply(plugin, args)
        } else if (typeof plugin === 'function') {
          plugin.apply(null, args)
        }
官方use源码
import { toArray } from '../util/index'
export function initUse (Vue: GlobalAPI) {
 Vue.use = function (plugin: Function | Object) {
// 限制了自定义组建的类型
   const installedPlugins = (this._installedPlugins || (this._installedPlugins =
[]))
//保存注册组件的数组,不存在及创建
   if (installedPlugins.indexOf(plugin) > -1) {
//判断该组件是否注册过,存在return Vue对象
     return this
   }
//调用`toArray`方法
   const args = toArray(arguments, 1)
   args.unshift(this)
//将Vue对象拼接到数组头部
   if (typeof plugin.install === 'function') {
//如果组件是对象,且提供install方法,调用install方法将参数数组传入,改变`this`指针为该组件
     plugin.install.apply(plugin, args)
   } else if (typeof plugin === 'function') {
//如果传入组件是函数,这直接调用,但是此时的`this`指针只想为`null`
     plugin.apply(null, args)
   }
//在保存注册组件的数组中添加
   installedPlugins.push(plugin)
   return this
 }
}
toArray方法源码
export function toArray (list: any, start?: number): Array<any> {
  start = start || 0
  let i = list.length - start
//将存放参数的数组转为数组,并除去第一个参数(该组件)
  const ret: Array<any> = new Array(i)
//循环拿出数组
  while (i--) {
    ret[i] = list[i + start]
  }
  return ret
}
原文地址:https://segmentfault.com/a/1190000017162947
Vue.use原理及源码解读的更多相关文章
- 2,MapReduce原理及源码解读
		
MapReduce原理及源码解读 目录 MapReduce原理及源码解读 一.分片 灵魂拷问:为什么要分片? 1.1 对谁分片 1.2 长度是否为0 1.3 是否可以分片 1.4 分片的大小 1.5 ...
 - 第二十三课:jQuery.event.add的原理以及源码解读
		
本课主要来讲解一下jQuery是如何实现它的事件系统的. 我们先来看一个问题: 如果有一个表格有100个tr元素,每个都要绑定mouseover/mouseout事件,改成事件代理的方式,可以节省99 ...
 - http-proxy-middleware使用方法和实现原理(源码解读)
		
本文主要讲http-proxy-middleware用法和实现原理. 一 简介 http-proxy-middleware用于后台将请求转发给其它服务器. 例如:我们当前主机A为http://loca ...
 - Future、FutureTask实现原理浅析(源码解读)
		
前言 最近一直在看JUC下面的一些东西,发现很多东西都是以前用过,但是真是到原理层面自己还是很欠缺. 刚好趁这段时间不太忙,回来了便一点点学习总结. 前言 最近一直在看JUC下面的一些东西,发现很多东 ...
 - serve-index用法、实现原理(源码解读)
		
本文主要讲解serve-index的用法和实现原理(源代码分析). 一 说明 serve-index的功能是将文件夹中文件列表显示到浏览器中. serve-index是一个NodeJS模块,可以通过N ...
 - Vue 源码解读(12)—— patch
		
前言 前面我们说到,当组件更新时,实例化渲染 watcher 时传递的 updateComponent 方法会被执行: const updateComponent = () => { // 执行 ...
 - HttpClient 4.3连接池参数配置及源码解读
		
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
 - HttpClient4.3 连接池参数配置及源码解读
		
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
 - Vue 源码解读(3)—— 响应式原理
		
前言 上一篇文章 Vue 源码解读(2)-- Vue 初始化过程 详细讲解了 Vue 的初始化过程,明白了 new Vue(options) 都做了什么,其中关于 数据响应式 的实现用一句话简单的带过 ...
 
随机推荐
- k8s资源清单定义入门
			
1.资源分类 a.workload型资源:service.pod.deployment.ReplicaSet.StatefulSet.Job.Cronjob; b.服务发现及服务均衡资源型资源:Ser ...
 - 转载:P2P技术原理及应用(1)
			
转帖allen303allen的空间 作 者:金海 廖小飞 摘要:对等网络(P2P)有3种主要的组织结构:分布式哈希表(DHT)结构.树形结构.网状结构.P2P技术已 经延伸到几乎所有的网络应用领域, ...
 - luogu P1922 女仆咖啡厅桌游吧
			
题目背景 小v带萌萌的妹妹去玩,妹妹想去女仆咖啡馆,小v想去桌游吧. 妹妹:“我问你个问题,答不对你就做我一天的奴隶,答对了就今天我就全部听你的.” 小v:“全部都听!?” 妹妹:“嘻嘻嘻,你还是回答 ...
 - 使用python一步一步搭建微信公众平台
			
https://my.oschina.net/yangyanxing/blog/159215 http://www.ziqiangxuetang.com/django/python-django-we ...
 - IDG | 四则运算表达式计算
			
分析 首先将中缀表达式转换为后缀表达式(逆波兰式),然后使用栈进行计算. 没有考虑括号.小数. 代码 import java.util.LinkedList; import java.util.Lis ...
 - LoadRunner多负载产生器
			
Executive Summary : The following explains why it is necessary to have about 6 load generators when ...
 - 怎样把多个Android Project打包成一个APK
			
怎样把多个Android Project打包成一个APK(你的项目怎样引用其它项目). 怎样把多个android project 打包成一个apk呢,事实上原理是这种.一个主project引用其它的p ...
 - initializer_list、初始化列表、列表初始化
			
什么是列表初始化 使用一个花括号来初始化变量,表现形式如下: std::vector<int>a{1,2,3,4,5}; 或者 std::vector<int>a = {1,2 ...
 - Webview页面的控件元素定位
			
前言 现在有很多App都是Hybrid的,即有原生的页面又有Webview的页面,元素的可以通过uiautomatorviewer工具 进行控件元素的定位,Webview页面的则无法通过此方式定位,而 ...
 - idea 编辑yml文件没有联想功能,解决方案
			
idea 编辑yml文件没有联想功能,解决方案 https://segmentfault.com/q/1010000010556550 按Ctrl+Shift+Alt+S,点Facets如果没有添加s ...