FumadocsZDecode
React

表单库

React 生态中有多个优秀的表单库,各有不同的设计哲学和适用场景。选择合适的表单库能显著提升开发效率和应用性能。


一、主流表单库对比

特性Ant Design FormFormikReact Hook Form
体积较大轻量最小
性能中等良好最优(非受控)
学习成本中等较高
验证方式内置规则Yup 集成多种支持
中文文档完善较少
适用场景企业级快速开发高性能需求

二、Ant Design Form

官方表单组件,集成了 Ant Design 设计规范,适合企业级项目。

优点

  • 组件丰富、功能完善
  • 中文文档和社区支持好
  • 集成验证和错误提示
  • 与 Ant Design 其他组件配合紧密

缺点

  • 包体积较大
  • 样式定制相对复杂

基础示例

import { Form, Input, Button, message } from 'antd'

function LoginForm() {
  const [form] = Form.useForm()

  const onFinish = (values: any) => {
    console.log('表单值:', values)
    message.success('提交成功')
  }

  return (
    <Form form={form} onFinish={onFinish} layout="vertical">
      <Form.Item
        label="用户名"
        name="username"
        rules={[{ required: true, message: '请输入用户名' }]}
      >
        <Input placeholder="输入用户名" />
      </Form.Item>

      <Form.Item
        label="密码"
        name="password"
        rules={[{ required: true, message: '请输入密码' }]}
      >
        <Input.Password placeholder="输入密码" />
      </Form.Item>

      <Form.Item>
        <Button type="primary" htmlType="submit" block>
          登录
        </Button>
      </Form.Item>
    </Form>
  )
}

三、Formik

轻量级表单库,API 简单直观,适合快速开发。

优点

  • 学习成本低,API 清晰
  • 体积小,集成灵活
  • 支持 Yup、Joi 等验证库
  • 易于与自定义 UI 组件结合

缺点

  • 没有内置 UI 组件,需要自己搭建
  • 样式和验证提示需要手动处理

基础示例

import { Formik, Form, Field, ErrorMessage } from 'formik'
import * as Yup from 'yup'

const validationSchema = Yup.object({
  email: Yup.string().email('邮箱格式错误').required('邮箱必填'),
  password: Yup.string().min(6, '密码至少 6 位').required('密码必填'),
})

function FormikForm() {
  return (
    <Formik
      initialValues={{ email: '', password: '' }}
      validationSchema={validationSchema}
      onSubmit={(values) => {
        console.log('表单值:', values)
      }}
    >
      <Form>
        <div>
          <label htmlFor="email">邮箱</label>
          <Field id="email" name="email" type="email" />
          <ErrorMessage name="email" component="div" />
        </div>

        <div>
          <label htmlFor="password">密码</label>
          <Field id="password" name="password" type="password" />
          <ErrorMessage name="password" component="div" />
        </div>

        <button type="submit">提交</button>
      </Form>
    </Formik>
  )
}

四、React Hook Form

基于 Hook 的高性能表单库,采用非受控组件方案,性能最优。

优点

  • 性能最好,最小化重新渲染
  • 包体积最小
  • 基于原生 HTML 表单
  • 支持多种验证方式

缺点

  • 学习曲线相对较陡
  • 需要理解非受控组件概念
  • 中文资源较少

基础示例

import { useForm } from 'react-hook-form'

interface FormData {
  username: string
  email: string
  age: number
}

function HookForm() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<FormData>({
    defaultValues: { username: '', email: '', age: 0 },
  })

  const onSubmit = (data: FormData) => {
    console.log('表单值:', data)
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label htmlFor="username">用户名</label>
        <input
          id="username"
          {...register('username', { required: '用户名必填' })}
        />
        {errors.username && <span>{errors.username.message}</span>}
      </div>

      <div>
        <label htmlFor="email">邮箱</label>
        <input
          id="email"
          {...register('email', {
            required: '邮箱必填',
            pattern: {
              value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
              message: '邮箱格式错误',
            },
          })}
        />
        {errors.email && <span>{errors.email.message}</span>}
      </div>

      <button type="submit">提交</button>
    </form>
  )
}

五、选择建议

企业级项目Ant Design Form

  • 完善的中文生态和组件库
  • 内置验证和样式方案
  • 与 Ant Design 设计体系集成

快速迭代项目Formik

  • 上手快,API 简洁
  • 灵活搭配自定义 UI
  • 文档清晰易懂

高性能需求React Hook Form

  • 最小包体积,最优性能
  • 减少不必要的重新渲染
  • 适合复杂表单场景

选择原则:企业级项目优先 Ant Design Form 因为生态完善,快速开发选 Formik 因为上手快,性能敏感的项目选 React Hook Form 因为它最优。根据项目规模、团队背景、性能要求来判断。

On this page