Skip to content

ElFormBuilder

ElFormBuilderEllFormSchema[] 描述整表:经 parseSchema 切成 fields / group / custom 块,在 el-form 内组合 ElFormLayoutElFormGroupElFormRenderer,并通过 portal-vue保存 / 提交 / 重置 等操作投递到外部 PortalTarget(如 ${uid}-actions)。适合 CRUD、分步表单等与 ElCruPage 配合的场景。

前置阅读

  • 单字段控件与 controlTypeFormRenderer
  • 字段类型 EllFieldSchemadependenciesvisible@element-plus-lab/utils(主包 export type 白名单)
  • 网格与 ProviderConfigProvider

基础用法

v-model 绑定整表数据对象;schema 为混合数组(扁平字段、type: 'group' 分组、type: 'custom' 自定义块)。

两种表单联动方式(重点)

联动均依赖 model(及可选 active-tab)变化重算;最终在表单项上体现为 显隐禁用必填规则控件 props 等。显隐由下列两种方式共同参与(见下一小节「组合规则」)。

方式一:dependencies 声明式联动

在字段上配置 dependencies 对象,用同一套 model 驱动多个侧面,常用键:

类型作用
triggerFieldsstring[](可选)仅当这些 model 键变化时参与 Vue 依赖收集;不传则依赖 model 顶层全部键
show(values) => boolean为假时不挂载该项(不参与校验)
disabled(values) => boolean为真时禁用控件;为假时在 mode: 'disabled' 下可局部放开
required(values) => boolean动态 el-form-item required
rules(values) => unknown动态规则;返回 undefined 时保留 formItemConfig.rules
controlConfig(values) => object与静态 controlConfig 合并动态覆盖同名键

一次 model 变更会对相关字段调用 evaluateFieldDependencies,结果传入 ElFormRendererdependency-eval),避免重复执行用户函数。

方式二:visible(payload) 函数式显隐

字段上配置 visible 函数,入参 EllFieldVisiblePayload

字段含义
tab来自 ElFormBuilderactive-tab(未传为 ''),用于多 Tab 分区
model当前整表数据
index字段在当前 schema 列表层的下标(根 fields 块、分组 children 各自从 0 计数)
schema当前字段项数据子集

适用于:分区 / 选项卡显隐与序号相关的展示条件等;代替 dependenciesshow——二者为 关系。

组合规则与建议

  • 最终是否挂载: resolveFieldItemVisible:先 dependencies.show(缺省 true),再与 visible(payload)(缺省 true逻辑与
  • 优先 triggerFields 字段多、依赖面窄时务必写上,减少无意义重算与模板依赖抖动。
  • 选型建议:
    • 业务字段值驱动的显隐 / 必填 / 规则 / 控件 props → 优先 dependencies
    • Tab / 分区、或强依赖 index 的规则 → 用 visible(仍可再叠加 dependencies 做必填等)。

其它联动补充:schema.events 可在用户操作时执行业务逻辑(与 FormRenderer 增强 payload 配合)。

Schema 与解析块

  • parseSchema(utils)将数组规范为块序列:相邻字段合并为 fieldsgroupchildren 与可选 layoutConfigcustom 支持 render 或 portal 占位。
  • 分组ElFormGroup + 内层 ElFormLayout;详见 表单方案

网格与表单项

  • grid / fixed-col-count / col-gap:与 ElFormLayout 一致;row-gap 在 Builder 上默认 0,需纵向间距时显式传 row-gap
  • compactgrid 未写列间距时可默认 8px;并挂载紧凑样式类。
  • label-width / label-config / form-config:经 mergeElFormBuilderBind 合并进 el-form;字段级 labelConfig 仍优先。

模式 mode

ElFormRenderer 一致:edit(默认)、disabledpreview(不注册控件 ref)。

操作与 portal

  • actionsEllActionConfig[]key / to / order / text / buttonProps / render)。内置 submit(校验后提交)、savereset** 的默认顺序与 portalorder 见实现。
  • submit-handler / save-handler / reset-handler:拦截对应默认行为。
  • 表级靶位: ${uid}-form-header${uid}-form-footer;分组 / 自定义块另有 ${uid}-${field}-…(与 ElCruPage 文档一致)。
  • uid:未传 ulid();与页头 PortalTarget 共用时请固定传入同一值

初始值与重置

  • initial-valuesresetFields 后把 model 恢复为与 el-form 对齐的快照(与 reset-handler 二选一逻辑以实现为准)。

暴露(defineExpose

名称说明
model / formRefv-modelel-form 同源
uid实例 id
mergedGridLayout / parsedBlocks合并后网格、解析块
formItemRef / getControlRef / getFormItemRef字段实例访问
getSchemaByFieldgetSchema查字段 schema
formHeaderPortalName / formFooterPortalName表级 portal 名字符串

事件

事件说明
submit校验通过且未由 submit-handler 吞掉
save / reset对应按钮
validate-failed校验失败
action自定义 action.key

Props(摘要)

属性说明
modelValuev-model整表数据(必填)
schemaEllFormSchema[](必填)
initial-values重置恢复用
uidportal 前缀
grid / fixed-col-count / col-gap / row-gap / compact网格
label-width / label-config / form-config表级标签与 el-form 透传
modeedit / disabled / preview
active-tabvisible(payload.tab)
actions / submit-handler / save-handler / reset-handler工具栏与提交语义

类型说明

ts
import type {
  ElFormBuilderProps,
  EllFormSchema,
  EllActionConfig,
} from 'element-plus-lab'
dependenciesvisible(utils 摘录)
ts
export interface EllFieldSchemaDependencies {
  triggerFields?: string[]
  show?: (values: Record<string, unknown>) => boolean
  disabled?: (values: Record<string, unknown>) => boolean
  required?: (values: Record<string, unknown>) => boolean
  rules?: (values: Record<string, unknown>) => unknown
  controlConfig?: (values: Record<string, unknown>) => Record<string, unknown>
}

/** payload.schema:与 utils 中 EllFieldSchemaBase 对齐 */
export interface EllFieldVisiblePayload {
  tab: string
  model: Record<string, unknown>
  index: number
  schema: EllFieldSchemaBase
}

显隐: evaluateFieldDependencies 得到 dep.show(未配置 dependenciesshow 时为真),再与 visible未配置visible(payload) 为真;二者同时为真才挂载。

完整 ElFormBuilderProps 以发布包 d.ts 为准。

相关

贡献者

页面历史

Released under the Apache License 2.0.