表單

React Hook Form + Zod / TanStack Form

推薦

React Hook Form + Zod

使用的人多,遇到問題一查就容易找到答案。shadcn/ui 的表單也是這個組合

比較效果

用每個函式庫做了同樣的東西,動手試試看。

React Hook Form + Zod
TanStack Form

比較程式碼

修改程式碼,右邊的預覽會跟著變化。

在你自己的專案裡執行這個範例:npx shadcn@latest add button input label

import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { z } from "zod"
import { Button } from "./components/ui/button"
import { Input } from "./components/ui/input"
import { Label } from "./components/ui/label"

// ① 規則:把所有驗證規則集中寫在一個地方
const schema = z.object({
  email: z.email("請輸入有效的電子郵件地址"),
  password: z.string().min(8, "至少需要 8 個字元").regex(/[0-9]/, "請至少包含一個數字"),
})

// 根據規則產生表單值的型別
type FormValues = z.infer<typeof schema>

export default function App() {
  // 建立表單(規則透過 zodResolver 傳入)
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<FormValues>({ resolver: zodResolver(schema) })

  // 只有全部規則都通過時才會呼叫
  const onSubmit = (values: FormValues) => {
    alert("已登入:" + values.email)
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col gap-4 p-5">
      <div className="flex flex-col gap-2">
        <Label htmlFor="email">電子郵件</Label>
        {/* ② 連接:把輸入欄位接上表單 */}
        <Input id="email" {...register("email")} />
        {/* ③ 提示:不符合規則時顯示錯誤 */}
        {errors.email && (
          <p className="text-sm text-destructive">{errors.email.message}</p>
        )}
      </div>

      <div className="flex flex-col gap-2">
        <Label htmlFor="password">密碼</Label>
        <Input id="password" type="password" {...register("password")} />
        {errors.password && (
          <p className="text-sm text-destructive">{errors.password.message}</p>
        )}
      </div>

      <Button type="submit">登入</Button>
    </form>
  )
}

比較

截至 2026 年 10 月

React Hook Form + Zod

推薦官方網站 ↗

特色

最多人使用的組合。只要在輸入欄位加上 register 就能收集值,驗證規則則用 Zod 集中撰寫

適用情境

推薦。shadcn/ui 的表單也是用這個組合做的

TanStack Form

官方網站 ↗

特色

和 TanStack Query 等同一系列、比較新的函式庫。每個輸入欄位都用 form.Field 包起來撰寫。型別(TypeScript)檢查很細

適用情境

想和 TanStack 的其他函式庫統一。輸入欄位很多,想靠型別避免出錯