跳到主要内容

Form 表单

用于收集、校验和提交表单数据。

何时使用

  • 需要创建一个数据录入表单
  • 需要对用户输入进行验证
  • 需要进行数据提交
  • 需要动态增删表单项

示例

基础用法

最简单的用法,通过 onFinish 获取表单数据。

实时编辑器
function Demo() {
  const handleFinish = (values) => {
    console.log('表单数据:', values);
    alert(JSON.stringify(values, null, 2));
  };

  return (
    <Form onFinish={handleFinish}>
      <FormItem
        name="username"
        label="用户名"
        rules={[{ required: true, message: '请输入用户名' }]}
      >
        <Input placeholder="请输入用户名" />
      </FormItem>
      <FormItem
        name="email"
        label="邮箱"
        rules={[
          { required: true, message: '请输入邮箱' },
          { type: 'email', message: '请输入有效的邮箱地址' },
        ]}
      >
        <Input placeholder="请输入邮箱" />
      </FormItem>
      <FormItem>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

表单布局

通过 layout 属性设置表单布局方式。

实时编辑器
function Demo() {
  const [layout, setLayout] = React.useState('vertical');

  return (
    <div>
      <Group style={{ marginBottom: '24px' }}>
        <Button onClick={() => setLayout('horizontal')}>水平布局</Button>
        <Button onClick={() => setLayout('vertical')}>垂直布局</Button>
        <Button onClick={() => setLayout('inline')}>行内布局</Button>
      </Group>

      <Form layout={layout} onFinish={(values) => console.log(values)}>
        <FormItem name="name" label="姓名" rules={[{ required: true }]}>
          <Input />
        </FormItem>
        <FormItem name="age" label="年龄">
          <Input />
        </FormItem>
        <FormItem>
          <Button type="submit">提交</Button>
        </FormItem>
      </Form>
    </div>
  );
}
结果
Loading...

表单验证

支持多种验证规则。

实时编辑器
function Demo() {
  const handleFinish = (values) => {
    alert('验证通过: ' + JSON.stringify(values));
  };

  return (
    <Form onFinish={handleFinish}>
      <FormItem
        name="username"
        label="用户名"
        rules={[
          { required: true, message: '用户名不能为空' },
          { min: 3, message: '用户名至少3个字符' },
          { max: 20, message: '用户名最多20个字符' },
        ]}
      >
        <Input />
      </FormItem>
      <FormItem
        name="password"
        label="密码"
        rules={[
          { required: true, message: '密码不能为空' },
          { min: 6, message: '密码至少6个字符' },
        ]}
      >
        <InputPassword />
      </FormItem>
      <FormItem
        name="confirm"
        label="确认密码"
        dependencies={['password']}
        rules={[
          { required: true, message: '请确认密码' },
          ({ getFieldValue }) => ({
            validator(_, value) {
              if (!value || getFieldValue('password') === value) {
                return Promise.resolve();
              }
              return Promise.reject(new Error('两次密码不一致'));
            },
          }),
        ]}
      >
        <InputPassword />
      </FormItem>
      <FormItem>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

动态表单项

使用 FormList 实现动态增删表单项。

实时编辑器
function Demo() {
  const { Add, Trash } = KubedIcons;

  return (
    <Form onFinish={(values) => console.log(values)}>
      <FormList name="users">
        {(fields, { add, remove }) => (
          <>
            {fields.map(({ key, name, ...restField }) => (
              <Group key={key} style={{ marginBottom: '12px' }}>
                <FormItem
                  {...restField}
                  name={[name, 'firstName']}
                  label=""
                  rules={[{ required: true, message: '请输入名' }]}
                  style={{ marginBottom: 0, flex: 1 }}
                >
                  <Input />
                </FormItem>
                <FormItem
                  {...restField}
                  name={[name, 'lastName']}
                  label=""
                  rules={[{ required: true, message: '请输入姓' }]}
                  style={{ marginBottom: 0, flex: 1 }}
                >
                  <Input />
                </FormItem>
                <Button variant="text" color="error" onClick={() => remove(name)}>
                  <Trash size={16} />
                </Button>
              </Group>
            ))}
            <Button onClick={() => add()} leftIcon={<Add size={16} />}>
              添加用户
            </Button>
          </>
        )}
      </FormList>
      <FormItem style={{ marginTop: '24px' }}>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

表单方法

使用 useForm Hook 获取表单实例,调用表单方法。

实时编辑器
function Demo() {
  const [form] = useForm();

  const handleFill = () => {
    form.setFieldsValue({
      username: 'admin',
      email: 'admin@example.com',
    });
  };

  const handleReset = () => {
    form.resetFields();
  };

  const handleGetValues = () => {
    const values = form.getFieldsValue();
    alert(JSON.stringify(values, null, 2));
  };

  return (
    <div>
      <Group style={{ marginBottom: '16px' }}>
        <Button onClick={handleFill}>填充数据</Button>
        <Button onClick={handleReset}>重置</Button>
        <Button onClick={handleGetValues}>获取值</Button>
      </Group>
      <Form form={form} onFinish={(values) => console.log(values)}>
        <FormItem name="username" label="用户名" rules={[{ required: true }]}>
          <Input />
        </FormItem>
        <FormItem name="email" label="邮箱" rules={[{ required: true, type: 'email' }]}>
          <Input />
        </FormItem>
        <FormItem>
          <Button type="submit" variant="filled" color="primary">
            提交
          </Button>
        </FormItem>
      </Form>
    </div>
  );
}
结果
Loading...

复选框组

在表单中使用 CheckboxGroup。

实时编辑器
function Demo() {
  return (
    <Form onFinish={(values) => alert(JSON.stringify(values, null, 2))}>
      <FormItem name="permissions" label="权限" rules={[{ required: true, message: '请选择权限' }]}>
        <CheckboxGroup>
          <Checkbox label="读取" value="read" />
          <Checkbox label="写入" value="write" />
          <Checkbox label="删除" value="delete" />
          <Checkbox label="执行" value="execute" />
        </CheckboxGroup>
      </FormItem>
      <FormItem>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

网格布局

使用 Grid 组件实现复杂的表单布局。

实时编辑器
function Demo() {
  return (
    <Form onFinish={(values) => console.log(values)}>
      <Row gutter={[16, 16]}>
        <Col span={12}>
          <FormItem name="firstName" label="" rules={[{ required: true }]}>
            <Input />
          </FormItem>
        </Col>
        <Col span={12}>
          <FormItem name="lastName" label="" rules={[{ required: true }]}>
            <Input />
          </FormItem>
        </Col>
        <Col span={12}>
          <FormItem name="email" label="邮箱" rules={[{ required: true, type: 'email' }]}>
            <Input />
          </FormItem>
        </Col>
        <Col span={12}>
          <FormItem name="phone" label="电话" rules={[{ required: true }]}>
            <Input />
          </FormItem>
        </Col>
        <Col span={24}>
          <FormItem name="address" label="地址">
            <Textarea />
          </FormItem>
        </Col>
      </Row>
      <FormItem>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

帮助文本和提示

使用 helptooltip 属性添加额外信息。

实时编辑器
function Demo() {
  const { Question } = KubedIcons;

  return (
    <Form onFinish={(values) => console.log(values)}>
      <FormItem
        name="username"
        label="用户名"
        help="用户名用于登录系统"
        rules={[{ required: true }]}
      >
        <Input />
      </FormItem>
      <FormItem
        name="apiKey"
        label="API 密钥"
        tooltip="API密钥用于接口调用认证,请妥善保管"
        rules={[{ required: true }]}
      >
        <Input />
      </FormItem>
      <FormItem>
        <Button type="submit" variant="filled" color="primary">
          提交
        </Button>
      </FormItem>
    </Form>
  );
}
结果
Loading...

API

Form 属性

属性说明类型默认值
form表单实例,通过 useForm 创建FormInstance-
name表单名称string-
layout表单布局'horizontal' | 'vertical' | 'inline''vertical'
labelAlign标签对齐方式'left' | 'right''right'
labelCol标签栅格布局ColProps{span: 4}
wrapperCol输入控件栅格布局ColProps{span: 14}
size表单组件尺寸KubedSizes'sm'
initialValues表单初始值object-
onFinish提交表单且验证通过后的回调(values: any) => void-
onFinishFailed提交表单且验证失败后的回调(errorInfo: ValidateErrorEntity) => void-
onValuesChange字段值更新时触发回调(changedValues, allValues) => void-
validateMessages验证提示模板ValidateMessages-
scrollToFirstError提交失败自动滚动到第一个错误字段boolean | Optionsfalse
其他原生属性HTMLAttributes<HTMLFormElement>-
信息

关于表单布局

  • horizontal:水平布局,标签和表单控件在同一行
  • vertical:垂直布局,标签和表单控件上下排列(默认)
  • inline:行内布局,所有表单项在一行

关于表单实例

  • 使用 useForm() Hook 创建表单实例
  • 表单实例提供了丰富的方法来操作表单

FormItem 属性

属性说明类型默认值
name字段名string | string[]-
label标签文本ReactNode-
rules校验规则Rule[]-
required是否必填booleanfalse
help提示信息ReactNode-
tooltip提示信息(悬停显示)ReactNode-
dependencies依赖字段string[]-
valuePropName子节点的值属性名string'value'
initialValue初始值any-
其他原生属性HTMLAttributes<HTMLElement>-
信息

关于校验规则

  • required: 是否必填
  • type: 字段类型(stringnumberemailurl 等)
  • min / max: 最小/最大长度或值
  • pattern: 正则表达式
  • validator: 自定义验证函数
  • message: 错误提示信息

关于 dependencies

  • 当依赖字段更新时,会触发当前字段的验证
  • 常用于确认密码等场景

FormList

用于渲染动态表单项列表。

<FormList name="users">
{(fields, { add, remove }) => (
<>
{fields.map((field) => (
<FormItem key={field.key} {...field}>
<Input />
</FormItem>
))}
<Button onClick={() => add()}>添加</Button>
</>
)}
</FormList>

Form 实例方法

方法说明类型
getFieldValue获取指定字段的值(name: string) => any
getFieldsValue获取所有字段的值() => any
setFieldValue设置指定字段的值(name: string, value: any) => void
setFieldsValue设置多个字段的值(values: any) => void
resetFields重置表单(fields?: string[]) => void
validateFields触发表单验证(nameList?: string[]) => Promise<any>
submit提交表单() => void
scrollToField滚动到指定字段位置(name: string, options?: Options) => void

使用建议

表单验证

常用的验证规则示例:

// 必填
{ required: true, message: '此字段为必填项' }

// 邮箱
{ type: 'email', message: '请输入有效的邮箱地址' }

// 长度限制
{ min: 3, max: 20, message: '长度在3到20个字符之间' }

// 正则表达式
{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号' }

// 自定义验证
{
validator: (_, value) => {
if (value && value < 18) {
return Promise.reject('年龄必须大于18岁');
}
return Promise.resolve();
}
}

动态表单

使用 FormList 实现动态表单:

<FormList name="members">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row key={field.key}>
<Col span={10}>
<FormItem {...field} name={[field.name, 'name']}>
<Input />
</FormItem>
</Col>
<Col span={10}>
<FormItem {...field} name={[field.name, 'age']}>
<Input />
</FormItem>
</Col>
<Col span={4}>
<Button onClick={() => remove(field.name)}>删除</Button>
</Col>
</Row>
))}
<Button onClick={() => add()}>添加成员</Button>
</>
)}
</FormList>

表单联动

通过 dependencies 和自定义验证实现表单联动:

<FormItem name="country" label="国家">
<Select />
</FormItem>

<FormItem
name="province"
label="省份"
dependencies={['country']}
rules={[
({ getFieldValue }) => ({
validator(_, value) {
const country = getFieldValue('country');
if (country === 'China' && !value) {
return Promise.reject('请选择省份');
}
return Promise.resolve();
},
}),
]}
>
<Select />
</FormItem>