基于 vue2.x + element-ui 我的自定义表单,你不试试么(一)

403 阅读6分钟

公司这两年做了一款档案项目,其中需要使用到自定义表单的功能,希望可以拖拽字段,自定义布局。因为公司的前任领导已经做过了两版自定义表单,但不具备拖拽和自定义布局的功能,所以我在阅读过前两版的代码,重新编写这个第三版的自定义表单,可以拖拽和自定义布局,字段关联校验等功能。大家有需要的可以看看,试试。

先上传送门

下面我将从整个表单的设计来给大家介绍,我也将会把整个表单的设计介绍文档持续更新。本期主要介绍表单字段自定义布局表单关联规则相关内容

Form

一个完整的自定义表单应该是由 字段(Field)布局数据(Layout)表单附属规则(AttachedRule)三部分组成。
字段是表单的最小粒度,Field 详情

Layout 布局数据

布局数据是用来表示表单展现形式的数据。
在创建表单时,可以通过拖拽字段来自定义表单的内容。也可以在表单内右击菜单创建行与列来布置表单。 自定义拖拽布局,有如下的核心规则:

  • 字段只能存在于
  • 只能存在于
  • 可以存在于模板容器
  • 模板容器中只能存在

正是由于上面第三条规则,自定义布局的功能变得十分强大,行与列可以相互嵌套进行布局

// layout
{
  layoutType: 'default',
  pcLayout: {
    rowsData: [
      // ... 自定义布局模式下的结构数据
    ],
    layoutConfig: {
      // ... 自定义布局模式下的表单样式的配置参数
    }
  },
  mobileLayout:[
    // ... 移动端经过排序的字段name集合
  ]
}

AttachedRule 表单附属规则

表单附属规则有 FieldAttachedRuleFieldCorrelativeRules

  • FieldAttachedRule(字段在表单中的附属规则集合)用于描述字段是否必填、是否展示名称、宽度等属性
  • FieldCorrelativeRules(字段在表单中的关联规则集合)用于描述字段在业务需要的情况下与相关联的字段进行动态展示、修改值等操作

Field 字段

字段是一份表单内的最小粒度。

// field 的数据形式
{
  "name": "teacher_field_159428032900017261", // 字段的唯一值
  "type": "input", // 字段类型
  "label": "单行文本", // 字段名称
  "value": "默认值", // 字段的默认值
  "configurable": true, // 属性是否可配置
  "isFormField": true, // 是否是表单字段
  "attrs": { // 字段的自定义配置属性
    "placeholder": "占位符文字",
    "maxlength": 101,
    "dataType": "phone",
    "pattern": ""
  }
}

现有的字段类型

名称描述类型
input文本输入字段base(基础字段)
Number数字输入字段base(基础字段)
textarea文本域输入字段base(基础字段)
date日期输入字段base(基础字段)
time时间输入字段base(基础字段)
dateRange日期范围输入字段base(基础字段)
select下拉单项选择字段base(基础字段)
mulSelect下拉多项选择字段base(基础字段)
radioGroup单选框组字段base(基础字段)
checkboxGroup多选框组字段base(基础字段)
switchCom开关字段base(基础字段)
title标题字段layout(布局字段)
divider分割线字段layout(布局字段)
blankLine空白行字段layout(布局字段)
subform明细字表high(高阶字段)

AttachedRule 字段的附属规则计算

attachedRule 方法接收 required 和 label 两个参数。

  • required:表单附属规则中自定义配置的是否必填属性
  • label:字段自定义配置的字段名称填属性

应返回一个 Rule 对象或数组,校验规则参见 async-validator


CorrelativeRule 字段的关联规则计算

  • CorrelativeRule 主要用于动态计算返回字段的判断条件
  • CorrelativeRule 方法接收 condition 条件 对象一个参数。 应返回一个字符串,表示字段关联的判断条件
// 内置 input 字段的关联规则
export default {
  // ...
  correlativeRule(condition) { // 字段的关联规则
    const { value, fieldName, judge, compareFieldName, isCompareField } = condition
    const fieldVal = `form['${fieldName}'].value`
    const judeValue = isCompareField
      ? `form['${compareFieldName}'].value`
      : `'${value}'`
    let str = ''
    switch (judge) {
      case '==':
      case '!=':
        str += `${fieldVal} ${judge} ${judeValue}`
        break;
      case 'nullStr':
        str += `!${fieldVal}`
        break;
      case 'unnullStr':
        str += `${fieldVal}`
        break;
      default:
        str += 'true'
        break;
    }
    return str
  }
  // ...
}

FieldCorrelativeRules

配置字段之间的关联规则

correlativeRule.jpg

在表单中,因为项目的业务需求,各个字段产生各种关联关系。常见的关联关系如下:

  • 下拉单选/单项选择 选择某一项,修改另一个字段的
  • 下拉单选/单项选择 选择某一项,控制另一个字段的 显示/隐藏
  • 下拉单选/单项选择 选择某一项,修改另一个含选项字段的 选项列表
  • 填报了多了个字段时,经过条件判断,触发某种 消息提醒

Rule Obj

规则对象的完整属性如下:

名称说明类型
key规则的唯一值String
conditions规则的判断条件数组,条件对象详细如下表Array
T_message条件满足时的消息提示String
F_message条件满足时的消息提示String
T_handle条件满足时的执行动作数组,动作对象详细如下表Array
F_handle条件不满足时的执行动作数组,动作对象详细如下表Array

Condition Obj

条件对象的完整属性如下:

名称说明类型可选值默认值
key条件的唯一值String--
type条件类型Stringcondition 条件 / connector 连接符condition
connector连接符String--
fieldName条件关联的字段nameString--
fieldType条件关联的字段类型String--
valueType条件关联的字段value的类型String--
judge条件判断语句, 详细见下表String--
value条件判断的值String--
isCompareField与表单内的替他字段进行对比Number--
compareFieldName用于条件对比的字段的nameString--

Judge

字段可选的条件判断语句完全是根据字段的 value 类型,来展示对应的判断语句选项

名称说明通用类型
==等于String, Boolean, Number
!=不等于String, Boolean, Number
contains包含Array
uncontains不包含Array
nullStr为空String, Number
unnullStr不为空String, Number
nullArr数组为空Array
unnullArr数组不为空Array
大于Number
<小于Number
>=大于等于Number
<=小于等于Number

Handle Obj

动作对象的完整属性如下:

名称说明类型可选值默认值
key条件的唯一值String--
type动作类型StringC_value 修改值 / C_show 显示隐藏 / C_options 修改选项列表-
fieldName动作关联的字段nameString--
fieldType动作关联的字段类型String--
valueType动作关联的字段value的类型String--
value满足条件时,修改字段的值String--
show满足条件时,控制字段的显示隐藏Boolean-true
options满足条件时,控制字段的选项列表Array-[]

博主将持更新表单的介绍文档,欢迎大家来使用指导