el-form组件
我们在上一篇文章中发现el-button的一部分属性来源于el-form组件,我们翻出了el-form的源码模块,主要包含在form文件夹内部。form文件夹主要包含了下面的源码。
./packages/form/index.js
./packages/form/src/form.vue
./packages/form/src/form-item.vue
./packages/form/src/form-item.vue
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
merge.js中定义的方法其实很简单,函数接受一个对象数组,将整个数组拍平为一维形式。
在form-item.vue文件中,其大执形式是由
父标签包裹子标签(本文不做说明,详细代码可以自行研究)。方法的一些原理做了注释,我们主要看computed计算属性中的fieldValue,其中用到了外部的方法:
./src/utils/util.js (getPropByPath)
该外部方法的大致作用就是给于一个path路径标识符数组,系统通过对标识符数组对对象内部数据进行访问,直到找到底部。
methods模块中,我们先来看getRules和getFilterRules两个函数。getRules函数中,formRules是el-form中的rules,selfRules是自身内部的rules,最后返回的是rules的数组。getFilterRules筛选掉无用的rule规则,返回规则的对象(一维形式)。
在form-item.vue中,引入了emitter这个模块:
./src/mixins/emitter
我们可以看出emitter是封装好的事件通信函数,emitter可以跨级实现组件的事件通信,其中,broadcast是子组件向父组件发送事件,dispatch是父组件向各级子组件发送事件。