FxForm 表单
具有数据收集、校验和提交功能的表单容器。配合 FxFormItem 组织字段,内置 async-validator 校验引擎,支持 blur/change 触发、行内/垂直布局、统一 size/disabled 透传、必填星号、校验状态图标。不依赖任何 UI 框架。
基础用法
FxForm 用 :model 绑定数据对象、:rules 绑定校验规则;FxFormItem 用 prop 指向 model 的字段。formRef.validate() 触发全量校验,resetFields() 重置。
表单校验
配置 rules 后,控件在 blur/change 触发时自动校验;点击「立即创建」会执行全量校验。required、min/max、type: array、type: email 等内置规则覆盖常见场景。
自定义校验
当内置规则无法满足时,通过 validator(rule, value, callback) 自定义校验逻辑。本示例演示密码二次确认联动校验(输入新密码后自动触发确认项重校)和异步校验(年龄校验延迟 1s),并启用 status-icon 展示校验结果图标。
行内表单
设置 inline 后,所有 FxFormItem 横向排列,适合查询栏、过滤条等紧凑场景。
表单尺寸
size 透传到表单内所有接入 useFormItem 的控件(FxInput/FxSelect/FxInputNumber/FxCheckbox/FxRadio 等),统一切换 large/default/small;label-position 控制 label 位置。
数字类型校验
v-model.number 配合 type: 'number' 规则,可校验输入是否为数字;规则写在 FxFormItem 的 :rules 上可针对单项配置。
无障碍
FxFormItem 的 label 会自动关联到内部第一个控件;当一项内包含多个输入时(如姓名 + 姓氏),需在每个输入上单独设置 aria-label,placeholder 不能替代。
对齐方式
FxForm 与 FxFormItem 均支持 label-position,可分别控制「表单整体对齐」与「单项对齐」,单项设置优先于表单设置。
动态增减表单项
通过 v-for 渲染动态字段,:prop 用 domains.${index}.value 路径形式指向 model 的嵌套字段,:rules 在项上单独配置。新增/删除字段后表单值与校验状态自动同步。
局部引入
ts
import { FxForm, FxFormItem } from "@fx/components"
import type {
FxFormInstance,
FxFormItemInstance,
FormRules,
FormItemRule,
} from "@fx/components"FxForm API
Attributes
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| model | 表单数据对象 | Record<string, any> | — |
| rules | 表单校验规则 | FormRules | — |
| label-position | label 位置 | 'left' | 'right' | 'top' | right |
| label-width | label 宽度(如 '80px',支持 'auto') | string | number | — |
| label-suffix | label 后缀 | string | — |
| require-asterisk-position | 必填星号位置 | 'left' | 'right' | left |
| hide-required-asterisk | 是否隐藏必填星号 | boolean | false |
| inline | 是否行内表单 | boolean | false |
| inline-message | 是否行内展示校验信息 | boolean | false |
| status-icon | 是否展示校验结果图标 | boolean | false |
| show-message | 是否展示错误信息 | boolean | true |
| validate-on-rule-change | rules 变化是否触发校验 | boolean | true |
| scroll-to-error | 校验失败是否滚动到首个错误项 | boolean | false |
| scroll-into-view-options | 滚动配置 | ScrollIntoViewOptions | boolean | true |
| size | 表单内组件尺寸 | 'large' | 'default' | 'small' | — |
| disabled | 是否禁用表单内所有组件 | boolean | false |
Events
| 名称 | 说明 | 回调参数 |
|---|---|---|
| validate | 任一字段校验完成时触发 | (prop, isValid, message) |
Methods(ref)
| 名称 | 说明 |
|---|---|
| validate | 全量校验,返回 Promise<void>,失败时 reject |
| validate-field | 校验指定字段 (props?, callback?) |
| reset-fields | 重置表单(恢复初始值 + 清空校验) |
| clear-validate | 清空校验状态 (props?) |
| scroll-to-field | 滚动到指定字段 (prop) |
Slots
| 名称 | 说明 |
|---|---|
| default | 表单项内容(FxFormItem) |
FxFormItem API
Attributes
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prop | model 的字段键(支持路径数组,用于 validate/resetField) | string | string[] | — |
| label | label 文本 | string | — |
| label-width | label 宽度(覆盖 form) | string | number | — |
| label-position | label 位置(覆盖 form) | 'left' | 'right' | 'top' | — |
| required | 是否必填(省略则由规则决定) | boolean | — |
| rules | 该项校验规则 | FormItemRule | FormItemRule[] | — |
| error | 字段错误信息(设置后立即进入 error 态) | string | — |
| validate-status | 校验状态 | '' | 'error' | 'validating' | 'success' | — |
| for | 等价原生 label 的 for | string | — |
| inline-message | 是否行内展示校验信息 | boolean | — |
| show-message | 是否展示错误信息 | boolean | true |
| size | 该项内组件尺寸 | 'large' | 'default' | 'small' | — |
Slots
| 名称 | 说明 | 作用域 |
|---|---|---|
| default | 字段控件 | — |
| label | 自定义 label | { label } |
| error | 自定义错误内容 | { error } |
Methods(ref)
| 名称 | 说明 |
|---|---|
| validate | 校验该项 (trigger, callback?) |
| reset-field | 重置该项 |
| clear-validate | 清空该项校验状态 |
校验规则
rules 为配置式(async-validator),每个字段是规则数组:
ts
const rules: FormRules = {
name: [
{ required: true, message: "请输入姓名", trigger: "blur" },
{ min: 2, max: 5, message: "长度 2-5 个字符", trigger: "blur" },
],
age: [
{ required: true, message: "请输入年龄", trigger: "blur" },
{ type: "number", message: "必须为数字", trigger: "blur" },
],
}常用规则字段:required / min / max / len / type / pattern / validator(自定义) / trigger('blur'|'change') / message。
实现说明
- 校验引擎:
async-validator,rules配置式;FxFormItem内用Schema实例校验,支持blur/change触发过滤与全量validate。 - 字段接入:表单控件(
FxInput/FxSelect/FxCheckbox/FxRadio/FxSwitch/FxSlider/FxInputNumber)通过useFormItem接入,blur/change时上报校验,并透传size/disabled、关联label for。 - 嵌套字段:
prop支持字符串路径数组(如['user', 'name']),rules按嵌套结构提供。 - 样式:走
@fx/stylestoken(--color-danger/--color-text-*/--fw-*/--radius-*),fx-form/fx-form-itemBEM,亮暗自动跟随。 - 校验图标:开启
status-icon后,校验图标由受控控件(FxInput/FxSelect)在自身 suffix 内渲染(类名fx-input__validate-icon);form-item通过feedback态下发显隐信号,is-error态下钻使受控控件 wrapper 边框变红。图标走@fx-core/icon:成功ep:circle-check、失败ep:circle-close、校验中ep:loading。
