实现三个目标
首先讲讲总体思想,所谓的低代码表单就是后端传递一个特殊结构的对象数组,然后确定根据这个对象数组来自动生成表单,这个对象结构可以是这样的:
interface FormItem {
value: "" // 预填
config: { // 配置
field: 0 // 字段类型
validator: '[0-9]{2}' // 正则校验
SelectOptions: ['男','女'] // 选项
placeholder: "xxx" // 需要透传到原生元素节点的html属性
}
}
然后我们定义好每个原子组件,比如Input组件、Select组件等,然后利用vue动态组件来动态地选择渲染哪个组件。在这个过程中,我们定义Form组件,作为一个整体的表单组件,它会接收前面说的对象数组并负责迭代渲染每一个具体的组件,而在Form组件到原生元素节点之间建立一个Field组件,来做为中间层进行一些处理,例如数据处理。
按这种设计思路,组件数据流就是这样的:
Form
|
Filed
|
原生节点
如何传递html属性到原生表单元素上?
通过$attrs透传config对象
如何获取每个表单子项的数据到Form组件中并实现数据校验?
在Field组件监听onChange事件可以获取数据,并通过emit(’update:modelValue’)
将数据传递到Form表单组件中。这样的优点是能够实时地获取数据,在某些时候会很有用,但是缺点也有很多:
因此我们还需要做另外一个方案来弥补这些缺点,并且还能实现校验。
这个方案的思路是通过defineExpose
暴露一个校验函数,函数校验成功则返回输入数据,否则返回提示信息。
在用户点击表单提交时可以利用此校验函数进行校验,如果想用户每输入一个表单项就校验的话可以监听onBlur
事件。