web动态表单的思考

430 阅读3分钟

如何开发一个动态表单

1、场景

接到一个需求,业务系统都存在大量表单录入页面,需要表单录入的地方特别多,每次都需要写一个表单页面,工作显得重复且累赘,于是在团队的会议上我提出了,咋们能不能开发一个动态的表单,在一个配置中心经过一些列的表单配置,就可以生成一个页面,这样不仅仅大大提高我们的开发效率,也能在下个季度汇报工作的时候,能突出下自己的技术输出(没办法,内卷太严重)!!

2、第三方框架的尝试

最开始设想,想用第三方框架,这样能快速集成,开始想到的则是阿里飞猪的 XRender x-render.gitee.io/ 开始捣鼓了两天,发现这个东西,单纯配置表单,展示表单,还是比较方便,但是一定表单里面参杂了许多业务的内容,用起来不是特别的爽,于是我们就决定自己开发一个动态表单

2、开始

首先毋庸置疑,如果表单要想被配置出来,必须用一大段json 去描述这个表单,配置中心通过可视化的操作,生成一段json,保存于服务端,然后需要用的地方,解析这段json,然后展示出来。 于是我设计了一段json结构

{
    id: 'id', 
    variable: 'ID', // 提交form数据和服务端对应的字段
    type: 'input',  // 控件类型,详细类型见下发
    label: '输入框',
    description: '描述',
    props: { // 依据ant.desig组件的props
      addonAfter: '后tab',
      addonBefore: '前tab',
      allowClear: true,
      prefix: '前缀',
      suffix: '后缀',
    },
    options: [ // 只有下拉框,单选框,多选框才有
      {
        value: '选项1',
        text: '选项1',
      },
      {
        value: '选项2',
        text: '选项2',
      },
      {
        value: '选项3',
        text: '选项3',
      },
    ], 
    required: true, // 是否必输
    disabled: "{{formData.xx === '1'}}", // 禁用条件
    hidden: "{{formData.xx === '1'}}", // 隐藏条件
    role: [ // 暂时用正则表示验证规则
      {
        pattern: '^[A-Za-z0-9]+$',
        message: '只允许填写英文字母和数字',
      },
    ],
  },
 * type 类型
 * input 输入框 string
 * textarea 大输入框 string
 * date 日期框 date
 * dateTime 日期时间 dateTime
 * number 数字输入框 number
 * checkbox 是否选择 boolean
 * switch 是否开启 boolean
 * select 下拉单选 string
 * radio  点击单选 string
 * multiSelect 下拉多选 string[]
 * checkboxes 点击多选 string[]
 * html 文本 string
 * upload 上传
 * dateRange 日期范围
 *
 * logpage log页面 // 业务需要定制的页面
 * table 矩阵页面 // 业务需要定制的页面

当我们配置好表单后就会生成这段大的json,前台直接显示出来,到此一个动态表单就可以直接配置出来了

image.png

思考

可能有人说,看似思路没错,也不复杂,确实这个地方是不复杂,可以这个东西,主要是给产品运营使用的,类似这些

    disabled: "{{formData.xx === '1'}}", // 禁用条件
    hidden: "{{formData.xx === '1'}}", // 隐藏条件
    role: [ // 暂时用正则表示验证规则
      {
        pattern: '^[A-Za-z0-9]+$',
        message: '只允许填写英文字母和数字',
      },
    ],

对于这些的配置,对于非技术人员,还是有一定的难度的,而且他们也比较排斥这种配置, 于是他们变提出来,把这些配置,做成可视化的操作,对于这些,我觉得这才是动态表单最为复杂的地方,

  • 禁用条件,隐藏条件,联动条件

例如,当前表单的禁用条件,此处只写了一个模板字符串 {{formData.xx === '1'}},如果我们当前表单的禁用条件,受到1个控件,2个控件,3个控件。。。n控件的影响时候,此处的可视化配置如何做呢?同理隐藏条件, 好了,可能有些小伙伴可能会说,咋们每个控件的隐藏条件可以设置成一个数组,数组对应一个table 的每个tr(行) 每一行,代表一个规则,配置中心去配置这个table

然后需要展示表单的地方去解析,不得不承认这是一个思路

  • 验证条件。 当前验证条件则是用正则表达式表示,如何将正则表达式可视化去配置,其实也是一个比较复杂的点,于是我想到一个方法,收集慢慢积累,很多的正则表达式在我们系统中,当我们要配置一个控件时候,去选一个正则表达式去作为他的验证条件(只是我的设想,没有具体去实现)

1、结语

开发第一阶段是结束了,给我的感觉就是,配置相对简单直观,对于复杂联动,复杂校验的可视化配置,其实还有一段路需要做

感谢各位老铁,点赞加关注