使用验证规则收集用户信息。
import * as React from "react";import { Form } from "radix-ui";import "./styles.css";const FormDemo = () => (<Form.Root className="FormRoot"><Form.Field className="FormField" name="email"><div style={{ display: "flex", alignItems: "baseline", justifyContent: "space-between", }} ><Form.Label className="FormLabel">Email</Form.Label><Form.Message className="FormMessage" match="valueMissing">Please enter your email</Form.Message><Form.Message className="FormMessage" match="typeMismatch">Please provide a valid email</Form.Message></div><Form.Control asChild><input className="Input" type="email" required /></Form.Control></Form.Field><Form.Field className="FormField" name="question"><div style={{ display: "flex", alignItems: "baseline", justifyContent: "space-between", }} ><Form.Label className="FormLabel">Question</Form.Label><Form.Message className="FormMessage" match="valueMissing">Please enter a question</Form.Message></div><Form.Control asChild><textarea className="Textarea" required /></Form.Control></Form.Field><Form.Submit asChild><button className="Button" style={{ marginTop: 10 }}>Post question</button></Form.Submit></Form.Root>);export default FormDemo;
基于原生浏览器 约束验证 API。
支持内置验证。
支持自定义验证。
完全自定义验证消息。
可访问的验证消息。
支持客户端和服务器端场景。
焦点完全管理。
从命令行安装组件。
导入所有部分并将它们组合在一起。
包含表单的所有部分。
字段的包装器。它自动处理 ID/名称和标签的可访问性。
一个标签元素,当嵌套在 Field 部分内时会自动连接。
一个控制元素(默认是 input),当嵌套在 Field 部分内时会自动连接。
当嵌套在 Field 部分内时,验证消息会自动连接(功能和可访问性)到给定的控件。它可用于内置和自定义客户端验证,以及服务器端验证。当在 Field 外部使用时,必须传递一个与字段相匹配的 name 属性。
Form.Message 接受一个 match 属性,用于确定何时应显示该消息。它匹配原生 HTML 有效性状态(ValidityState 在 MDN 上),该状态会验证 required、min、max 等属性。如果控件的有效性状态中的给定 match 为 true,则消息将显示。
您还可以将函数传递给 match 以提供自定义验证规则。
使用此渲染属性组件访问给定字段的有效性状态(请参见 MDN 上的 ValidityState)。在嵌套在 Field 部分内时,字段的有效性会自动可用,否则必须传递一个 name 属性以关联它。
提交按钮。
使用 asChild,您可以将 Form 原语部分与您自己的组件组合。
它也可以用于组合其他类型的控件,例如 select:
注意: 目前还不可能将
Form与 Radix 的其他表单原语如Checkbox、Select等组合。我们正在寻找解决方案。
当未提供 children 时,Form.Message 将为给定的 match 渲染默认错误消息。
通过传递您自己的 children,可以提供更有意义的消息。这对于国际化也很有用。
除了上述所有内置的客户端验证匹配之外,您还可以在仍然利用平台验证能力的同时提供自己的自定义验证。它使用 约束验证 API 中的 customError 类型。
可以将您自己的验证函数传递到 Form.Message 上的 match 属性。以下是一个示例:
match将以控件的当前值作为第一个参数,整个FormData作为第二个参数调用。match也可以是一个async函数(或返回一个 promise)以执行异步验证。
我们向相关部分添加了 data-valid 和 data-invalid 属性。利用它相应地设置您的组件样式。以下是样式设置 Label 部分的示例。
您可能需要访问字段的原始有效性状态,以显示自己定义的图标,或通过其定义的属性与组件库进行交互。您可以通过使用 Form.ValidityState 部分来做到这一点:
该组件还支持使用相同的 Form.Message 组件进行服务器端验证。
您可以通过传递 forceMatch 属性来重用为客户端错误定义的相同消息,无论客户端匹配逻辑如何,均强制显示该消息。
如果客户端上不存在该消息,您也可以渲染没有 match 的 Form.Message。
通过将 serverInvalid 布尔属性传递给 Form.Field 部分,可以将字段标记为无效。
以下是带有服务器端错误处理的示例:
您应该使用 Form.Root 部分的 onClearServerErrors 回调属性清除服务器错误。在表单重新提交之前和表单重置时,它将清除服务器错误。
此外,这还提供了何时重置单个服务器错误的控制。例如,您可以在用户编辑它时立即重置电子邮件服务器错误:
该组件遵循“内联错误”模式进行验证:
Form.Field 中提供的 name 将标签和控件关联