【手写 Vue2.x 源码】第三十四篇 - 组件部分-Vue组件与初始化流程简介

news/2024/11/8 20:30:06/

一,前言

上篇,进行了diff算法阶段性梳理,主要涉及以下几个点:

  • 初渲染与视图更新流程;
  • diff 算法的外层更新;
  • diff 算法的比对优化;
  • diff 算法的乱序比对;
  • 初渲染和更新渲染判断;

本篇,组件的初始化流程介绍;


二,组件使用介绍

1,组件的介绍

组件源于 WebComponent,即 Web 组件;原生支持自定义标签,但是兼容性不好;

所以,Vue 和 React 实现了一套组件 API;

2,组件的定义

在 vue 中,组件分为"全局组件"和"自定义组件"两种,定义方式如下:

2.1 全局组件

<body><div id="app1"><!-- 可以使用my-button组件 --><my-button></my-button></div><div id="app2"><!-- 可以使用my-button组件 --><my-button></my-button></div><script>Vue.component('my-button',{template:'<button>Hello Vue</button>'})new Vue({el: "#app"});</script>
</body>

全局组件通过 Vue.component('xxx',{...})定义,可在全局范围使用;

2.2 局部组件

<body><div id="app1"><!-- 可以使用 --><my-button></my-button></div><div id="app2"><!-- 不可以使用 --><my-button></my-button></div><script>new Vue({el: "#app1",// 声明局部组件-只能在声明作用域 app1 下使用components:{'my-button':{template:'<button>Hello Vue 局部组件</button>'}}});</script>
</body>

局部组件,只能在声明作用域下被使用;

3,组件的优先级

<body><div id="app"><my-button></my-button></div><script>// 全局组件Vue.component('my-button',{template:'<button>Hello Vue 全局组件</button>'})new Vue({el: "#app",// 局部组件components:{'my-button':{template:'<button>Hello Vue 局部组件</button>'}}});</script>
</body>

同名的全局组件和局部组件同时存在,根据组件查找规则,优先使用局部组件;

相同名称的全局组件和局部组件定义并不会被覆盖,而是会像原型链一样,逐级向上进行查找;


三,组件初始化流程简介

1,Vue.component API

Vue.component 是全局 API;

Vue 初始化时的 initGlobalAPI 方法,会集中处理 Vue Global API

// 方法定义
Vue.component = function (id, definition) {}

2,Vue.extend

在 Vue.component 中,当第二个参数 definition 为对象时,会默认调用 Vue.extend 进行处理;

Vue.extend:使用基础 Vue 构造器,创造一个子类;即组件的构造函数;

3,保存组件构造函数

将组件名与构造函数的映射关系,保存到全局对象 Vue.options.components 中;

备注:全局组件中需要使用全局属性,同时便于后续的组件合并;

4,组件合并

在 Vue 初始化时,_init 方法会进行 mergeOptions 合并选项;

内部通过组件合并策略,完成“全局组件”和“局部组件”的合并;

备注:此时的vm.constructor.options中包含了Vue.options.components

组件的查找规则:优先找自己,找不到通过链上去找父亲;

5,组件合并的策略

模板编译流程:
html 模板 -> AST 语法树 -> render 函数;

在 render 函数中,会通过 _c 即 createElm 处理标签和组件;

createComponent 方法:创造组件虚拟节点 componentVnode

6,组件的初渲染和更新

根据组件的虚拟节点,创建出组件的真实节点;并将组件插入到父元素中;

组件初始化时,会为每个组件创建一个 watcher;

依赖收集:属性收集对应组件渲染的 watcher 记录到 dep 中;

当组件更新时,遍历通知 dep 数组中对应的 watcher 进行组件更新;


四,结尾

本篇,介绍了 Vue 组件与初始化流程,涉及以下几部分:

  • 组件使用介绍:组件定义和优先级;
  • 组件初始化流程介绍:Vue.component、Vue.extend、保存组件构造函数、组件合并、初渲染和更新;

下一篇,Vue.component 实现;


维护日志

20210808:

  • 更新文章标题为“组件部分-Vue组件与初始化流程简介”;
  • 调整“组件初始化流程简介”部分内容:体现组件初始化流程中各主要环节及对应的文章更新计划;

20210813:

  • 修改部分文字和单词拼写错误;

http://www.ppmy.cn/news/18455.html

相关文章

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数理统计的特点是 背记的内容多&#xff0c; 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义&#xff1a; 设 ...... 为取自某总体的样本&#xff0c; 若样本函数TT(, ... ) 中不含有任何未知参数&#xff0c; 则称T 为统计…

[QMT]01-我的第一个Python策略

新年立个Flag 学写50个QMT策略:新建一个 Python 策略创建方法&#xff1a;我的主页-新建策略删掉模板带的内容,输入第一个策略 01-HelloWorld:编写 Python 策略需在开始时定义编码格式&#xff0c;如 gbk。Init 方法和 handlebar 方法的定义是必须的。上图展示了如何在 QMT 系统…

YOLO v2主要看这些重点

来源&#xff1a;投稿 作者&#xff1a;ΔU 编辑&#xff1a;学姐 往期内容&#xff1a; YOLOv1学习笔记 论文 《YOLO9000:Better, Faster, Stronger》 Joseph Redmon∗†, Ali Farhadi∗† University of Washington∗ , Allen Institute for AI† http://pjreddie.com/…

应届生身份为什么重要?

文章目录一、应届生身份的划分1、企业角度2、学校角度3、国家角度二、应届生身份的重要性1、国考/省考2、企业招聘3、落户政策4、签约保障一、应届生身份的划分 国家统一招生的高校毕业生离校时&#xff0c;和在择业期内&#xff08;国家规定择业期为两年&#xff09;未落实工…

Java是编译性语言还是解释型语言 ?

首先我们应该了解这两种语言的概念 . 高级语言在计算机上执行 , 有两种方式 , 分为编译型语言和解释型语言 . 编译型语言 : 编写源代码–>编译–>链接. 典型的编译型语言 : C/C . 特点 : 源代码中一处有错 , 就不允许编译 ; 编译过程中出现一处错误 , 就停止编译 . 优…

【操作系统】—— 如何使用VMware虚拟机(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

2023牛客寒假算法基础集训营2

目录C Tokitsukaze and abn (hard)E Tokitsukaze and FunctionF Tokitsukaze and Gold Coins (easy)H Tokitsukaze and K-SequenceL Tokitsukaze and Three IntegersC Tokitsukaze and abn (hard) 思路&#xff1a; 差分 算贡献每个位置被几条线段覆盖&#xff0c;直接返回c…

2023年网络安全比赛--Linux渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交; 2.通过本地PC中渗透测试平台Kali对靶机场景进行渗透测试,将该场景/var/www/ht…