尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ant Design Form 表单校验进阶:其他表单控件(Select、Switch、Upload、Rate、ColorPicker 等)的校验配置全解析

Ant Design Form 表单校验进阶:其他表单控件(Select、Switch、Upload、Rate、ColorPicker 等)的校验配置全解析 Ant Design Form 表单校验进阶其他表单控件Select、Switch、Upload、Rate、ColorPicker 等的校验配置全解析【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design本指南以 validate-other demo 为主线系统讲解 Ant Design 表单中那些没有在前面基础示例中出现过的表单控件——包括 Select 多选、Switch、Slider、Rate、Upload/Dragger、ColorPicker 等的校验配置方式。读完你将掌握valuePropName、getValueFromEvent、noStyle、hasFeedback与rules含type: array的正确组合用法能够在一个 Form 中混排不同取值模型的控件并让校验准确生效。一、这个 Demo 在讲什么一份全控件校验清单在 components/form/demo/ 目录中basic 等示例只覆盖了 Input、Password、Select 等最常见的输入型控件而 validate-other.tsx 专门用来演示以上演示没有出现的表单控件对应的校验演示对应 demo 描述文件 validate-other.md 的 zh-CN 与 en-US 文案。从代码结构看该示例把所有控件放进一个namevalidate_other的 Form 里统一通过onFinish在提交时输出整份表单值。它至少覆盖了以下取值模型差异巨大的控件这正是它能独立成文的理由控件存储的字段值特殊配置点Select单选字符串rules必填Selectmodemultiple数组规则需声明type: arrayInputNumber数字noStyle嵌套在带标签的 Form.Item 中Switch布尔值valuePropNamecheckedSlider数字默认跟随拖动即写入Radio.Group / Radio.Button字符串按钮组同样适用 rulesCheckbox.Group数组通过 Row/Col 排版Rate数字可为小数无 rules 时静默取值Upload / DraggerfileList对象数组valuePropNamefileListgetValueFromEvent{normFile}ColorPicker颜色值可配置必填校验二、先理解桥接机制value / valuePropName / trigger / getValueFromEvent绝大多数新手疑惑来自为什么 Switch 的 Form.Item 不写 rules 也能提交答案是Form.Item 并不知道子控件是受控还是非受控它只负责把字段值与事件桥接给子控件。官方文档在 components/form/index.en-US.md 中明确指出After wrapped byForm.Itemwithnameproperty,value(or other property defined byvaluePropName)onChange(or other property defined bytrigger) props will be added to form controls, the flow of form data will be handled by Form.翻译成可执行的经验默认情况下Form.Item 向子控件注入value与onChange两个属性来维持数据流控件默认把值绑在valueprop 上触发字段更新的事件名默认为onChange源码中trigger onChange即为 FormItem/index.tsx 的解构默认值凡是值不在 value prop 上、事件不叫 onChange的控件都必须用valuePropName告诉 Form.Item 从哪个 prop 取值典型如 Switch/Checkbox 的checkedgetValueFromEvent负责把事件参数改造成真正要写入表单的值典型如 Upload 事件对象里的fileList。这正是 Demo 中大量使用valuePropName与getValueFromEvent的根本原因也是通读该示例前必须先建立的认知框架。三、表单骨架与 initialValues 的正确姿势Demo 顶部定义了两段复用性较强的配置const formItemLayout { labelCol: { span: 6 }, wrapperCol: { span: 14 }, };随后Form namevalidate_other {...formItemLayout} onFinish{onFinish} ...一次性把标签 6 栅格、输入控件 14 栅格的布局套用到全部 Form.Item 上省去逐个书写labelCol/wrapperCol的重复。值得注意style{{ maxWidth: 600 }}是纯样式约束不影响布局逻辑。initialValues{{ input-number: 3, checkbox-group: [A, B], rate: 3.5, color-picker: null, }}这里体现了几条对数组、数字型控件尤其重要的 initialValues 规则initialValues只会作为初始值生效修改它并不会动态重写表单动态改值应使用form.setFieldsValue见 components/form/index.en-US.md 的第 2 条字段名为带连字符的字符串时name与initialValues的 key 必须完全一致如input-number、checkbox-group多值控件如 Checkbox.Group初始值应给数组[A, B]与用户交互后存储的形态保持一致rate: 3.5证明 Rate 支持半星小数取值color-picker: null表示 ColorPicker 初始无色配合后文的required规则即可演示用户必须选色才能提交。四、逐个控件拆解校验与取值配置4.1 Select 单选与多选required 的两种形态单选 Select 是少数默认协议即可工作的下拉控件只需加一条最常见的必填规则Form.Item nameselect labelSelect hasFeedback rules{[{ required: true, message: Please select your country! }]} Select placeholderPlease select a country options{[ { label: China, value: china }, { label: U.S.A, value: usa }, ]} / /Form.ItemhasFeedback会在控件右侧渲染校验状态图标成功勾、错误叉等文档约定其推荐仅用于 Input 类控件此处用于 Select 是为演示反馈图标可结合 custom-feedback-icons 了解自定义反馈图标5.9.0 起支持icons配置。提交时值为字符串如china。多选形态才是本示例的进阶点Form.Item nameselect-multiple labelSelect[multiple] rules{[{ required: true, message: Please select your favourite colors!, type: array }]} Select modemultiple placeholderPlease select favourite colors options{[ { label: Red, value: red }, { label: Green, value: green }, { label: Blue, value: blue }, ]} / /Form.Item关键差别是规则上必须显式声明type: array。原因是校验器默认按字符串语义判定required空字符串、undefined、null都算空而多选 Select 未选时的值是空数组[]——若不加type: array空数组会被误判为已填写必填校验将失效。声明type: array后校验器以数组长度是否为 0来判断是否为空从而实现真正的必填校验。4.2 InputNumber noStyle把输入框后缀文案拼成一个表单项Demo 中给数字输入拼接了一个machines后缀但该后缀不参与表单数据Form.Item labelInputNumber Form.Item nameinput-number noStyle InputNumber min{1} max{10} / /Form.Item span classNameant-form-text style{{ marginInlineStart: 8 }} machines /span /Form.Item外层 Form.Item 只提供label排版真正的字段input-number由内层noStyle的 Form.Item 承载。noStyle默认false见 components/form/index.en-US.md表示作为纯字段控制使用、不渲染标签与包裹样式因此内外两层不会产生双重布局与双份错误展示区。从源码结构看FormItem/index.tsxnoStyle的 Item 还会把自身校验 meta 上报给外层 Form.Item让外层统一显示错误文案——machines文案得以与错误信息共存而不被挤乱。初始值input-number: 3落在min1, max10区间内点击加减按钮或直接输入超界数字时InputNumber 组件自身会阻止非法提交但要注意这属于组件级的边界限制并不等于 Form 的规则校验若需要超出范围给出明确错误信息仍应加rules。4.3 Switch 与布尔字段valuePropNamecheckedSwitch 的值不在value而在checkedprop 上因此必须改写注入目标Form.Item nameswitch labelSwitch valuePropNamechecked Switch / /Form.Item若不加valuePropNamecheckedForm 会把字段值注入到 Switch 的value上——该 prop 对 Switch 无意义勾选状态将永远无法回填提交时也拿不到真实开关状态。规则同样适用 Checkbox官方文档中的速记是Form.Item default bind value tovalueprop, but Switch or Checkbox value prop ischecked见 components/form/index.en-US.md。onFinish中收到的该字段将是true/false布尔值。4.4 Slider无规则时跟随拖动自动写入Form.Item nameslider labelSlider Slider marks{{ 0: A, 20: B, 40: C, 60: D, 80: E, 100: F, }} / /Form.ItemSlider 的取值 prop 就是标准的value、变更事件同样是onChange满足 Form.Item 的默认桥接协议因此无需任何额外配置。marks用于显示 A–F 刻度标签。此表单项没有 rules说明一个 Form 中可以自由混排需校验与仅收集的字段——只有声明了规则的字段才会参与必填拦截。4.5 Radio.Group 与 Radio.Button按钮组也能做必填普通单选组不设 rules作为对照按钮式单选组加了必填校验Form.Item nameradio-group labelRadio.Group Radio.Group Radio valueaitem 1/Radio Radio valuebitem 2/Radio Radio valuecitem 3/Radio /Radio.Group /Form.Item Form.Item nameradio-button labelRadio.Button rules{[{ required: true, message: Please pick an item! }]} Radio.Group Radio.Button valueaitem 1/Radio.Button Radio.Button valuebitem 2/Radio.Button Radio.Button valuecitem 3/Radio.Button /Radio.Group /Form.Item两者都遵循默认value/onChange协议。Radio.Button只是视觉上切换为按钮样式对 Form 而言其取值与校验模型和普通 Radio 完全一致——未选中的radio-button字段为undefined必填规则会触发 Please pick an item!。默认未选中任何项时提交错误信息会显示在该 Form.Item 下方。4.6 Checkbox.Group栅格排版的多选框组Form.Item namecheckbox-group labelCheckbox.Group Checkbox.Group Row Col span{8} Checkbox valueA style{{ lineHeight: 32px }}A/Checkbox /Col Col span{8} Checkbox valueB style{{ lineHeight: 32px }} disabledB/Checkbox /Col {/* C / D / E / F 同理 */} /Row /Checkbox.Group /Form.ItemCheckbox.Group 的受控协议同样是valueonChange值为选中项 value 组成的数组因此无需 valuePropName 改造。此处用Row/Col将 6 个选项排成两列三行span8×3 恰好铺满一行 24 栅格故两行共 6 项。disabled的 B 选项让用户无法取消初始值[A, B]中的 B用来演示部分锁定的交互形态。若要做必填校验参照 Select multiple 声明type: array即可。4.7 Rate可提交小数评分Form.Item namerate labelRate Rate / /Form.ItemRate 遵守默认 value/onChange 协议无额外配置。配合initialValues{{ rate: 3.5 }}首次渲染即显示半星。Rate 允许通过字符如allowHalf或键盘产生小数提交值可能是3.5这样的浮点数——若希望分数为整数可结合onChange取整或声明整数校验。五、文件上传类fileList 与 getValueFromEvent 的组合拳上传控件是表单值模型与原生事件模型差异最大的一类必须同时改写取值目标与事件取值函数。5.1 normFile把上传事件收敛成 fileListconst normFile (e: any) { console.log(Upload event:, e); if (Array.isArray(e)) { return e; } return e?.fileList; };该函数只做一件事如果参数本身是数组则原样返回否则取e.fileListArray.isArray(e)分支是为了兼容直接调用如初始化或外部写入fileList数组的场景保证无论 Form 传入的是事件对象还是数组都能规整成fileListconsole.log便于开发时观察 Upload 事件真实结构。5.2 图片列表式上传Form.Item nameupload labelUpload valuePropNamefileList getValueFromEvent{normFile} extralonggggggggggggggggggggggggggggggggggg Upload namelogo action/upload.do listTypepicture Button icon{UploadOutlined /}Click to upload/Button /Upload /Form.Item三处关键配置各司其职配置作用valuePropNamefileListUpload 受控值在fileListprop而非value需显式指定才能把已上传列表回填给 UploadgetValueFromEvent{normFile}把 onChange 收到的上传事件改造成fileList数组后写入表单 storeextra在 Form.Item 下方追加辅助说明文案与错误信息互不干扰listTypepicture让已选图片以缩略图卡片展示。此字段提交值将是 Upload 的 file 对象数组包含uid、name、status、originFileObj等字段action 指向演示用的/upload.do接口——真实项目中替换为业务上传地址。5.3 Dragger拖拽上传 noStyle 复用同一取值逻辑Form.Item labelDragger Form.Item namedragger valuePropNamefileList getValueFromEvent{normFile} noStyle Upload.Dragger namefiles action/upload.do p classNameant-upload-drag-iconInboxOutlined //p p classNameant-upload-textClick or drag file to this area to upload/p p classNameant-upload-hintSupport for a single or bulk upload./p /Upload.Dragger /Form.Item /Form.ItemUpload.Dragger 只是视觉上提供大块拖拽区对 Form 而言与普通 Upload 的取值协议完全一致因此valuePropNamefileList与getValueFromEvent{normFile}可原样复用。与 4.2 的 InputNumber 类似这里再次借助外层 Form.Item noStyle内层字段的组合让Dragger标签只负责布局与错误展示真正字段由内层管理避免双重样式。六、ColorPicker新控件的必填校验Form.Item namecolor-picker labelColorPicker rules{[{ required: true, message: color is required! }]} ColorPicker / /Form.Item配合initialValues中的color-picker: null初次渲染时 ColorPicker 无选中色直接点击 Submit 会触发 color is required!。该条目表明任何符合 value/onChange 协议的新控件接入 Form 后都能直接套用既有 rules 体系无需为校验单独写适配层。这也解释了 Demo 标题中 validate other 的寓意——校验能力是控件无关的通用机制。七、校验触发的进一步机制配套示例佐证rules只是声明校验什么而何时校验由另一组机制控制相关演示集中在 validate-trigger.tsxvalidateTriggeronBlur字段离开焦点时才校验适合输入过程中避免频繁打断的字段validateDebounce{1000}输入停止 1 秒后才校验用于高频输入默认触发时机见 components/form/index.en-US.mdForm.Item 层默认onChangevalidateFirst命中第一条规则后立即停下不再继续执行后续规则适合先查空、再查格式的分级校验不依赖 Form 的静态校验若完全不想用 Form 管理可只借助validateStatus/help/hasFeedback手工声明状态与文案参见 validate-static.md 及其 tsx 实现。八、源码印证数据流如何闭环从 FormItem/index.tsx 可以看到trigger onChange是 Form.Item 解构 props 时的默认值而 components/form/index.en-US.md 中valuePropName默认值为value。这意味着默认情况下整条链路是用户操作 → 子控件onChange触发 → Form.Item 通过getValueFromEvent规整参数 → 以valuePropName指定的 key 写入表单 store → 触发rules校验默认时机 onChange→ 校验结果经 meta 回传渲染错误文案与反馈图标。Demo 中每一个特殊控件本质上都是在修正这条链路上的某一环Switch/Checkbox → 修正写入目标为checkedUpload/Dragger → 修正写入目标为fileList并修正事件取值逻辑为取fileListSelect 多选/Checkbox.Group → 修正规则的字段类型语义为type: array。九、延伸阅读validate-other.tsx本文核心示例完整源码validate-trigger.tsx校验时机onBlur / debounce / validateFirstvalidate-static.tsx脱离 Form 的静态校验状态customized-form-controls.tsx自造受控组件 trigger变化上报getValueProps-normalize.tsxgetValueProps与normalize的数据整形time-related-controls.tsxDatePicker / TimePicker 的校验联动custom-feedback-icons.tsxhasFeedback自定义反馈图标components/form/index.en-US.mdForm.Item 全部 API 定义与默认值FormItem/index.tsxForm.Item 校验触发与 noStyle 上报的实现结语实践这类全控件校验示例时始终可以套用同一套排查顺序值在哪个 propvaluePropName→ 事件叫什么trigger默认 onChange→ 事件参数如何变成值getValueFromEvent→ 值的形态决定规则怎么写数组用type: array。把这一链路想清楚无论接入 Select、Switch、Upload 还是任何自定义控件校验配置都不会再成为难题。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表