el-form组件

我们在上一篇文章中发现el-button的一部分属性来源于el-form组件,我们翻出了el-form的源码模块,主要包含在form文件夹内部。form文件夹主要包含了下面的源码。

./packages/form/index.js

如何查看element plus 组件源码 elementui源码分析_html

./packages/form/src/form.vue

如何查看element plus 组件源码 elementui源码分析_标识符_02

./packages/form/src/form-item.vue

如何查看element plus 组件源码 elementui源码分析_标识符_03

./packages/form/src/form-item.vue

如何查看element plus 组件源码 elementui源码分析_html_04

index.js所完成的工作与上文相同,我们重点研究一下form.vue和form-item.vue模块。这两个单文件模块代表了form,form-item这两个ui元素的核心构成。

在form.vue中,从外部引入了merge.js文件和form-item.vue文件。html其实就是由form的html元素构成。props对象内部就是el-form提供给开发者的任意添加的属性。model是form表单绑定的实际数据对象,rules为验证规则,hideRequiredAsterisk为红色标记符号等等。。。其中规则函数rules被elform组件的watch列为监听函数,为fields数组内部所有元素添加相应的事件。data中包含了fields数组和自动计算宽度的变量。在methods方法中我们注意到一个细节,validate中fields数组实际上指代的就是form-item.vue中的el-form-item组件,因此一些方法会在form-item组件中显示。

我们来看看form.vue组件引用的外部方法,objectAssign引用的merge.js文件。

./src/utils/merge.js

如何查看element plus 组件源码 elementui源码分析_标识符_05

merge.js中定义的方法其实很简单,函数接受一个对象数组,将整个数组拍平为一维形式。

在form-item.vue文件中,其大执形式是由

父标签包裹子标签(本文不做说明,详细代码可以自行研究)。方法的一些原理做了注释,我们主要看computed计算属性中的fieldValue,其中用到了外部的方法:

./src/utils/util.js (getPropByPath)

如何查看element plus 组件源码 elementui源码分析_数组_06

该外部方法的大致作用就是给于一个path路径标识符数组,系统通过对标识符数组对对象内部数据进行访问,直到找到底部。

methods模块中,我们先来看getRules和getFilterRules两个函数。getRules函数中,formRules是el-form中的rules,selfRules是自身内部的rules,最后返回的是rules的数组。getFilterRules筛选掉无用的rule规则,返回规则的对象(一维形式)。

在form-item.vue中,引入了emitter这个模块:

./src/mixins/emitter

如何查看element plus 组件源码 elementui源码分析_标识符_07

我们可以看出emitter是封装好的事件通信函数,emitter可以跨级实现组件的事件通信,其中,broadcast是子组件向父组件发送事件,dispatch是父组件向各级子组件发送事件。