表单

HeroUI 提供了带有内置验证和样式的表单组件,帮助用户有效地输入和提交数据。

标签和帮助文本

可访问性的表单首先为每个字段提供清晰、描述性的标签。所有 HeroUI 表单组件支持使用 Label 组件进行标注,Label 组件会自动通过 idfor 属性与字段关联。

此外,HeroUI 组件支持帮助文本,帮助文本会为字段关联额外的上下文,例如 描述错误信息。当用户聚焦字段时,标签和帮助文本会由辅助技术(如屏幕阅读器)朗读。

大多数字段应有可见标签。在少数例外情况下,必须提供 aria-labelaria-labelledby 属性来识别该元素以供屏幕阅读器使用。

提交数据

表单数据的提交方式取决于您的框架、应用程序和服务器。默认情况下,HTML 表单会在浏览器中通过完整页面刷新来提交。您可以在 onSubmit 事件中调用 preventDefault,以通过 API 处理表单数据提交。

Next.js, RemixReact Router 等框架提供了自己的表单提交处理方式。

未受控表单

onSubmit 事件中使用浏览器的 FormData API 是获取表单数据的简单方法。您可以将这些数据发送到后端 API,或者使用 Object.fromEntries 将其转换为 JavaScript 对象。每个字段应有 name 属性来标识,浏览器将把值序列化为字符串。

控制表单

HeroUI 表单组件默认是未受控的,但如果您需要实时管理状态,可以使用 useState 钩子将组件变为受控。

自定义错误信息

默认情况下,错误信息由浏览器提供。您可以通过为 errorMessage 属性提供一个函数来自定义这些消息。

注意:默认错误信息会根据浏览器/操作系统的语言设置本地化。HeroUI Provider 中的 locale 设置 不会影响验证错误。

验证

表单验证对于确保用户输入正确的数据至关重要。HeroUI 支持原生 HTML 约束验证,并允许自定义验证与实时验证。

内置验证

HeroUI 表单组件支持 原生 HTML 验证 属性,如 isRequiredminLength。这些约束会在用户提交表单(或失去焦点)时由浏览器检查。您可以自定义样式来显示验证错误,而非使用浏览器默认 UI。

要启用 ARIA 验证,设置 validationBehavior="aria"。当 validationBehavior="aria" 时,字段仅在屏幕阅读器等辅助技术中被标记为必填或无效,而不会阻止表单提交。您可以使用 HeroUI Provider 在整个应用中更改表单默认值。

支持的约束包括:

  • isRequired 表示字段必须有值才能提交表单。
  • minValuemaxValue 指定日历或数值输入的最小和最大值。
  • minLengthmaxLength 指定文本输入的最小与最大长度。
  • pattern 为文本输入提供自定义正则表达式。
  • type="email"type="url" 分别为电子邮件地址和 URL 提供内置验证。

有关所支持验证属性的更多信息,请参阅每个组件的文档。

自定义验证

除了内置约束,您可以为 validate 属性提供一个函数来支持自定义验证。

实时验证

如果您想在用户输入时就显示验证错误,可以控制字段值并使用 isInvaliderrorMessage 属性。

使用 validationBehavior="aria" 以允许表单提交,即使字段无效,也保持可访问性。

服务器验证

客户端验证可以即时反馈,但您也应在服务器端验证以确保准确性和安全性。HeroUI 允许通过 validationErrors 属性在 Form 组件中显示服务器端验证错误。该属性应是一个对象,每个键是字段 name,对应的值为错误消息。

架构验证

HeroUI 支持来自架构验证库(如 Zod)的错误。您可以使用 Zod 的 flatten 方法获取每个字段的错误信息,并将它们作为服务器响应的一部分返回。

React 服务器操作

Server Actions 允许无缝地将表单提交到服务器并获取结果。useActionState 钩子可用于在提交表单后获取服务器操作(如错误)返回的结果。

Remix

Remix actions 处理服务器端表单提交。您可以使用 useSubmit 钩子将表单数据提交到服务器,使用 useActionData 钩子检索服务器返回的验证错误。

表单库

在大多数情况下,HeroUI 的内置验证功能已足够。但如果您正在构建更复杂的表单或将 HeroUI 组件整合到现有表单中,可以使用诸如 React Hook FormFormik 的表单库。

React Hook Form

您可以使用 Controller 将 HeroUI 组件与 React Hook Form 集成。Controller 允许您管理字段值和验证错误,并将验证结果映射到 HeroUI 组件。

更多关于 HeroUI 表单的信息,请参阅 React Aria Forms 指南