组件

Field

一个 React 表单字段容器,采用 Liquid Glass 标签、说明与校验信息,用于包裹单个表单控件。

Field 为一个 Base UI 表单控件提供可见标签、辅助说明与校验信息。它负责标签和有效性的关联,子控件则保留自己的玻璃表面与交互。

使用 Field 为 Input 提供可见标签、说明与校验信息。已经内置标签的控件,例如 Checkbox、Select、CheckboxGroup、RadioGroup 与 Switch,继续使用自己的 label 属性。多个字段需要共享标题时,请使用 Fieldset。

基础示例

通过 children 传入控件。Field 会渲染真实的 <label> 并与控件关联,因此输入框不需要再单独添加标签。children 必须是单个 Base UI 控件;原生 <input> 不会自动接入字段上下文。

We only use this address for account notices.

校验

validate 接收当前值;值有效时返回空,值无效时返回一个字符串或字符串数组。validationMode 决定校验时机:默认 onSubmit,也可使用 onBlur 或 onChange 提前反馈。validationDebounceTime 可以延迟输入过程中的 onChange 校验。

Use a work address so we can reach your team.

由于子控件是真实的表单元素,required、minLength、pattern、type 等原生约束会自动参与校验。

错误信息

设置 error 可以显示由外部状态控制的错误信息。字符串会直接渲染为错误信息。error 为真值时会标记字段无效,并在清除前优先于内置校验。错误信息通过 aria-describedby 关联到控件,控件同时会收到 aria-invalid。

This address is already in use.

Change the address to see the error clear.

将 React 元素传给 error 可以完全接管错误内容。外层消息元素仍持有 id 与 aria-describedby 关联,因此自定义内容依然具备可访问性。

This key expired on May 1.

Keys rotate every 90 days.

尺寸

支持 xs / sm / md / lg / xl,默认 md。请为控件传入相同的 size,让标签、信息与控件行保持对齐。

无障碍

Field 渲染真实的 <label> 并与控件关联。description 与 error 会把各自的 id 注册到控件的 aria-describedby;出现错误时,控件还会带有 aria-invalid。

键盘行为由被包裹的控件负责。请使用 label 而不是占位符作为可访问名称,确保在缩放、翻译与语音控制下仍然有效。分组控件继续使用自己的 label;共享标题请使用 Fieldset。字段禁用时,标签与信息会淡出,控件也会通过共享的字段状态被禁用。表单模式见可访问性指南。

API 参考

Field

属性类型默认值说明
childrenReactElement—由字段提供标签与校验的单个 Base UI 控件。必填。
labelReactNode—与控件关联的可见标签。
descriptionReactNode—控件下方的辅助说明,通过 aria-describedby 关联。
errorReactNode—错误信息。字符串直接渲染;React 元素会替换整个错误内容。为真值时将字段标记为无效。
size"xs" | "sm" | "md" | "lg" | "xl""md"标签、信息与间距尺寸。
validate(value, formValues) => string | string[] | null | void | Promise<...>—自定义校验。值无效时返回一条或多条信息。
validationMode"onSubmit" | "onBlur" | "onChange""onSubmit"字段执行校验的时机。
validationDebounceTimenumber0onChange 模式下两次 validate 调用之间的延迟,单位为毫秒。
invalidboolean—由外部状态标记字段无效。
disabledbooleanfalse通过字段禁用控件,并淡化标签与信息。
namestring—字段注册的表单字段名。
dirtyboolean—由外部状态标记字段已修改。
touchedboolean—由外部状态标记字段已触碰。
actionsRefRefObject<Field.Root.Actions | null>—命令式操作。调用 validate 可立即校验字段。
classNamestring—合并到字段根元素的 Tailwind 类名。
styleCSSProperties—内联样式,合并到与 className 相同的元素。
ui{ root?: ClassValue; label?: ClassValue; error?: ClassValue; description?: ClassValue }—按 data-slot 组织的内部槽位类名。
renderReactElement | ((props, state) => ReactElement)—替换字段根元素。

其余 Base UI Field.Root 属性会透传,包括 id。子控件仍可接收自己的属性;required、disabled 与原生约束应在属于该元素时设置到控件上。

属性说明
data-disabled字段禁用时存在。
data-valid字段有效时存在。
data-invalid字段无效时存在。
data-dirty字段值发生变化时存在。
data-touched字段被触碰后存在。
data-filled控件有值时存在。
data-focused控件聚焦时存在。
data-slot标记内部结构(root、label、error、description)以便样式覆盖。

主题

Field 本身没有玻璃表面,而是继承子控件的材质。可以通过共享的 --ui-drop-shadow-label token 调整标签投影,通过 --ui-field-gap、--ui-field-label-size 与 --ui-field-message-size 调整间距和字号,并使用 ui 按 data-slot 覆盖内部槽位。错误信息在浅色主题下使用 text-red-700,在暗色主题下使用 ui-dark:text-red-400;可通过 ui.error 覆盖。自定义 error 节点会直接渲染在 ui.error 内。组件级数值位于 src/theme/field.ts。Token 分层与预设见主题指南。

相关组件

  • Input — 放入 Field 的标准文本输入框。
  • Fieldset — 为一个相关字段组提供共享图例。
  • Checkbox Group — 使用自身标签与说明的分组控件。