使用验证规则收集用户的信息。
import React from 'react';import * as Form from '@radix-ui/react-form';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/name 和标签的可访问性。
当嵌套在 Field
部分内部时,自动连接的标签元素。
控件元素(默认情况下为 input
),当嵌套在 Field
部分内部时,自动连接。
验证消息,当嵌套在 Field
部分内部时,会自动连接到给定的控件(功能和可访问性)。它可用于内置和自定义客户端验证,以及服务器端验证。当在 Field
外部使用时,必须传递与字段匹配的 name
属性。
Form.Message
接收一个 match
属性,用于确定何时显示消息。它匹配原生 HTML 的有效性状态(ValidityState
,参见 MDN)。它根据诸如 required
、min
、max
等属性进行验证。如果控件的有效性状态中给定的 match
为 true
,则会显示消息。
您还可以将函数传递给 match
以提供自定义验证规则。
使用此 render-prop 组件在渲染时访问给定字段的有效性状态(参见 ValidityState
,参见 MDN)。当嵌套在 Field
部分内部时,字段的有效性会自动可用,否则您必须传递 name
属性进行关联。
提交按钮。
使用 asChild
,您可以将 Form
原语部分与您自己的组件组合。
它还可以用于组合其他类型的控件,例如 select
。
注意:目前,无法将
Form
与 Radix 的其他表单原语(如Checkbox
、Select
等)组合。我们正在努力寻找解决方案。
当未提供 children
时,Form.Message
将为给定的 match
渲染默认错误消息。
您可以通过传递您自己的 children
提供更有意义的消息。这对于国际化也很有用。
除了上面描述的所有内置客户端验证匹配之外,您还可以提供自己的自定义验证,同时仍然利用平台的验证功能。它使用 customError
类型,该类型存在于 约束验证 API中。
您可以将您自己的验证函数传递到 Form.Message
上的 match
属性中。这是一个示例
match
将使用控件的当前值作为第一个参数,以及整个FormData
作为第二个参数被调用。match
也可以是async
函数(或返回一个 promise)以执行异步验证。
我们在相关部分添加了 data-valid
和 data-invalid
属性。使用它来相应地设置组件的样式。以下是如何为 Label
部分设置样式的示例。
您可能需要访问字段的原始有效性状态,以便显示您自己的图标或通过其定义的 props 与组件库交互。您可以使用 Form.ValidityState
部分来实现。
该组件还支持使用相同的 Form.Message
组件进行服务器端验证。您可以通过传递 forceMatch
属性来重复使用为客户端错误定义的相同消息,该属性将强制显示消息,而不管客户端匹配逻辑如何。
如果客户端不存在该消息,您也可以在没有 match
的情况下渲染 Form.Message
。通过将 serverInvalid
布尔属性传递给 Form.Field
部分来将字段标记为无效。
以下是一个带有服务器端错误处理的示例
您应该使用 Form.Root
部分上的 onClearServerErrors
回调属性清除服务器错误。它将在表单重新提交之前以及重置表单时清除服务器错误。
此外,这提供了控制何时重置单个服务器错误的功能。例如,您可以尽快在用户编辑电子邮件时重置电子邮件服务器错误。
该组件遵循验证的“内联错误”模式。
Form.Field
上提供的 name
进行关联。