Form 表单

一组处理表单数据的组件和模型。

获取组件

import { Form } from 'rsuite';
  • 基础组件:
    • Form 用于定义支持数据校验的表单。
    • Form.Label 表单字段对应的标题。
    • Form.Control 定义表单字段的控件。默认为 Input 组件。 可以通过 accepter 属性自定义组件。
  • 布局相关组件:
    • Form.Stack 用于布局一组表单控件。
    • Form.Group 用于布局单个表单控件。
  • 字段状态组件:
    • Form.Text 提供表单字段的帮助信息。
    • Form.ErrorMessage 显示表单字段的错误提示信息。
  • Hooks
    • useFormControl: 为自定义表单组件提供表单控制功能的 Hook,使其能够与 Form 组件无缝集成。

布局


垂直布局

撑满容器

fluid 属性可以让表单中的 Input 100% 撑满容器,只在垂直布局中有效。

水平排列布局

行内排列布局

模态框中布局

状态


帮助说明

<Form.Text> 可以在表单组件下面定义一个帮助说明信息,如果设置 tooltip 属性,就会在表单组件显示一个图标,以 <Tooltip> 的方式显示帮助说明信息。

错误消息

错误消息提醒可以通过 2 种方式设定:

  • <Form.Control> 组件上传递一个 errorMessage 属性设置错误信息,通过 errorPlacement设置错误信息显示的位置 。
  • 自定义一个提示信息。

禁用与只读

可访问性

ARIA 属性

  • 您应该为每个表单设置 aria-labelaria-labelledby 属性,以便屏幕阅读器可以正确地读取表单的目的。
  • 通过 <Form.Group>controlId 属性,可以在 <Form.Control> 上设置 id 同时在 <Form.Label> 上设置 htmlFor。另外会为 <Form.Control> 生成aria-labelledbyaria-describedby, 对应到 <Form.Label><Form.Text>id
<Form.Group controlId="name">
  <Form.Label>Username</Form.Label>
  <Form.Control />
  <Form.Text>Username is required</Form.Text>
</Form.Group>

生成为:

<div class="rs-form-group" role="group">
  <label id="name-control-label" for="name" class="rs-form-control-label">Username</label>
  <div class="rs-form-control rs-form-control-wrapper">
    <input
      id="name"
      class="rs-input"
      aria-labelledby="name-control-label"
      aria-describedby="name-help-text"
    />
  </div>
  <span id="name-help-text" class="rs-form-help-text">Username is required</span>
</div>

必需的 JavaScript 功能

  • 在 Form 内点击 type='submit' 的按钮,会自动触发表单的 submit 事件。

Props

<Form>

名称 类型 (默认值) 描述
checkTrigger 'change' | 'blur' | 'none' ('change') 定义何时触发表单校验
disabled boolean (false) 禁用整个表单
errorFromContext boolean (true) 默认从 Context 获取 Form.Control 的错误提示
fluid boolean 使表单控件在垂直布局中 100% 撑满容器
formDefaultValue object 表单的初始默认值(非受控组件)
formError object 表单的错误信息
formValue object 表单的值(受控组件)
layout 'horizontal' | 'vertical' | 'inline' ('vertical') 表单布局方式
model Schema SchemaModel 实例对象
nestedField boolean (false) 支持表单数据嵌套
onChange (formValue: object, event) => void 数据改变时的回调函数
onCheck (formError: object) => void 数据校验时的回调函数
onError (formError: object) => void 校验出错时的回调函数
onReset (formValue: object, event?: FormEvent) => void 表单重置时的回调函数
onSubmit (formValue: object, event?: FormEvent) => void 提交表单时的回调函数,仅在数据校验通过后触发
plaintext boolean (false) 将表单显示为纯文本
readOnly boolean (false) 将表单设置为只读

<Form.Stack>

Version 6.0.0 or above

名称 类型(默认值) 描述
classPrefix string ('form-stack') 组件的 CSS 类前缀
fluid boolean 使表单控件在垂直布局中 100% 撑满容器
layout 'horizontal' | 'vertical' | 'inline' ('vertical') 表单布局方式
spacing number 控件之间的间距

<Form.Control>

名称 类型(默认值) 描述
accepter ElementType (Input) 被代理的组件
checkAsync boolean 是否进行异步数据校验
checkTrigger 'change' | 'blur' | 'none' 数据校验触发类型,覆盖 <Form> 中的设置
classPrefix string ('form-control') 组件的 CSS 类前缀
errorMessage ReactNode 显示的错误信息
errorPlacement Placement('bottomStart') 错误信息显示位置
name * string 控件的名称,支持嵌套路径,如 address.city,用于获取和设置表单值
plaintext boolean 将控件设置为纯文本
readOnly boolean 将控件设置为只读
rule checkType 字段的校验规则,若与 <Form>model 冲突则以当前为准,示例
shouldResetWithUnmount boolean('false') 卸载组件时是否删除字段值和错误信息

<Form.Group>

属性名称 类型(默认值) 描述
classPrefix string ('form-group') 组件的 CSS 类前缀
controlId string <Form.Control> 上设置 id,在 <Form.Label> 上设置 htmlFor

<Form.Label>

属性名称 类型(默认值) 描述
classPrefix string ('form-control-label') 组件的 CSS 类前缀
htmlFor string 对应 HTML label 标签的 for 属性,默认为 Form.Group 的 controlId

<Form.Text>

属性名称 类型(默认值) 描述
classPrefix string ('form-help-text') 组件的 CSS 类前缀
htmlFor string 对应 HTML label 标签的 for 属性,默认为 Form.Group 的 controlId
tooltip boolean 是否通过 Tooltip 组件显示

<Form.ErrorMessage>

属性名称 类型(默认值) 描述
classPrefix string ('form-error-message') 组件的 CSS 类前缀
placement Placement('bottomStart') 错误信息显示位置
show boolean 是否显示错误信息

Form ref

名称 类型 描述
check (callback?: (formError: E) => void) => boolean 检验表单数据
checkAsync () => Promise 异步检验表单数据
checkForField (fieldName: string, callback?: (checkResult: CheckResult) => void) => boolean 校验表单单个字段值
checkForFieldAsync (fieldName: string) => Promise 异步校验表单单个字段值
cleanErrorForField (fieldName: string, callback?: () => void) => void 清除单个字段错误信息
cleanErrors (callback: () => void) => void 清除错误信息
reset () => void 重置表单数据为初始值,并清除所有错误信息
resetErrors () => void 重置错误信息
submit () => void 触发表单提交并校验数据

Schema

Schema 依赖于 schema-typed 库,用于定义数据模型。

Placement

/**
 * Placement options for error messages in form controls.
 * The `static` option is supported from v6.0.0 onwards.
 */
type ErrorMessagePlacement =
  | 'static'
  | 'bottomStart'
  | 'bottomEnd'
  | 'topStart'
  | 'topEnd'
  | 'leftStart'
  | 'leftEnd'
  | 'rightStart'
  | 'rightEnd';

Hooks

useFormControl

Version 6.0.0 or above

useFormControl hook 为自定义表单组件提供表单控制功能。必须在 <Form> 组件内使用。

const {
  value, // 当前字段值
  error, // 字段错误信息
  plaintext, // 字段是否为纯文本模式
  readOnly, // 字段是否为只读
  disabled, // 字段是否禁用
  onChange, // 字段值变化处理函数
  onBlur, // 字段失焦事件处理函数
  onCheck, // 手动触发字段验证的处理函数
  setValue // 直接设置字段值
} = useFormControl(props);

属性

名称 类型(默认值) 描述
checkAsync boolean(false) 是否执行异步验证
checkTrigger 'change' | 'blur' | null 数据验证触发类型,会覆盖 Form 的 checkTrigger
errorMessage React.ReactNode 自定义错误信息
name string 表单字段名称(必填)
rule CheckType 验证规则(来自 Schema)
shouldResetWithUnmount boolean(false) 组件卸载时是否移除字段值和错误信息
value any 当前值(受控)

返回值

名称 类型 描述
disabled boolean 字段是否禁用(继承自 Form)
error React.ReactNode 字段错误信息
onBlur () => void 字段失焦事件处理函数
onChange (value: any, event: SyntheticEvent) => void 字段值变化处理函数
onCheck (value: any) => void 手动触发字段验证的处理函数
plaintext boolean 字段是否为纯文本模式(继承自 Form)
readOnly boolean 字段是否为只读(继承自 Form)
setValue (value: any, shouldValidate?: boolean) => void 直接设置字段值,不会触发 onChange 事件。如果 shouldValidate 为 true,将根据 checkTrigger 触发验证
value any 当前字段值

示例

import { useFormControl } from 'rsuite';

function CustomField({ name, label }) {
  const { value, error, onChange, onBlur } = useFormControl({ name });

  return (
    <div className="custom-field">
      <label>{label}</label>
      <input value={value || ''} onChange={e => onChange(e.target.value, e)} onBlur={onBlur} />
      {error && <div className="error-message">{error}</div>}
    </div>
  );
}

// 使用方式
<Form>
  <CustomField name="email" label="邮箱" />
</Form>;