注册vue组件的方法有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>一、了解组件注册的两种方式强>
1.1全局组件的注册方法
//main.js 从& # 39;进口Vue Vue # 39; 从& # 39;进口程序。/应用# 39; 从& # 39;进口路由器。/路由器# 39; Vue.config。productionTip=false 让你好={ 名称:& # 39;你好# 39; 模板:& # 39;这是全局组件你好# 39; } Vue.component(& # 39;你好# 39;,你好) 新Vue ({ 艾尔:& # 39;#应用# 39; 路由器, 组件:{应用}, 模板:& # 39;& # 39; })
上面我们就通过Vue.component()注册了一个全局组件你好,接下来分析源码实现的时候也是基于这个例子来进行的。
1.2局部组件的注册
& lt; template> & lt; div id=癮pp"祝辞 & lt; img src=https://www.yisu.com/zixun/薄?资产/logo.png”>
像这样就注册了一个HelloWorld的局部组件。
<强>二、全局组件注册的源码强>
1. vue初始化的时候,会调用initGlobalAPI ()
//敬肟?】//代码所在文件:src//global-api/index.js核心 导出功能initGlobalAPI (Vue: GlobalAPI) {//÷云渌薰卮? initAssetRegisters (Vue)//这个方法就是用于组件注册的方法 }
2。在initAssetRegisters()方法中执行组件的定义
//敬肟?】//代码所在文件:src//global-api/assets.js核心 导出功能initAssetRegister (Vue) { ASSET_TYPES.forEach (type=祝辞{//ASSET_TYPES包括组件,指令,过滤器 Vue函数[型]=(id、定义){//恍┨跫卸? 如果(type===& # 39;组件# 39;,,isPlainObject(定义)){ definition.name=definition.name | | id 定义=this.options._base.extend(定义)//将定义转换为一个继承于Vue的构造函数 }//渌嘈偷拇? this.options[类型+ & # 39;& # 39;][id]=//定义将这个构造函数挂载到Vue.options.components上 返回定义 } }) }
此时,我们可以单步调试一下我们上面的例子,来看一下定义一开始是什么,以及执行挂载后Vue.options变成了什么样子:
a.definition:其实传入的时候就是我们一开始定义的全局组件的具体内容
b.Vue。选择:可以看到我们定义的全局组件你好已经存在在Vue.options.components上了
3。实例化组件的时候,代码会执行到Vue.prototype._init()上面
//敬肟?】//代码所在文件:src/核心//init.js实例 Vue.prototype。_init=function(选项){//. .省略其他无关代码 如果选择,,options._isComponent){//组件 initInternalComponent (vm选项) 其他}{//非组件 vm。选择=mergeOptions(美元 resolveConstructorOptions (vm.constructor), 选项| | {}, 虚拟机 ) } }
这里将自己定义的组件的选择与Vue.options做了一个合并,并且赋值给了vm。选择美元,而通过【代码块2】我们可以知道全局组件的构造函数已经被放在了Vue.options.components上,所以经过这一步,vm。美元options.components上面也有了全局组件的构造函数,所以现在在任意组件都能拿到全局组件,因为任何组件初始化的时候都会执行这个合并。
我们可以通过单步调试上面的例子看一下现在的vm选项上美元。面有些什么
4。在创建vnode的过程中,会执行_createElement方法
//敬肟?】//代码所在文件:src//vdom/create-element.js核心 导出功能_createElement(上下文、标签、数据、儿童、正常化){ 如果(typeof标签===& # 39;字符串# 39;){//? 如果(config.isReservedTag(标签)){//A舻膆tml标签 }else if (isDef(男星=resolveAsset(上下文。选择美元,& # 39;组件# 39;标记))){//已经注册过的全局组件 vnode=createComponent(男星、数据上下文、儿童、标签) 其他}{//不是内置标签也不是已经注册过的组件,就创建一个全新的vnode vnode=new vnode ( 标签数据,孩子, 未定义,定义上下文 ) } } }注册vue组件的方法有哪些