关于 nextjs-tanstack-form
面向 Next.js 16 项目的 TanStack Form v1 开发参考,适用于需要复杂校验和服务端提交的表单。涵盖 Server Actions、共享配置及客户端与服务端错误合并。
主要功能
- 01集成 Next.js 16 Server Actions
- 02客户端与服务端共享 formOptions
- 03Zod 即时校验与数据库校验
- 04支持动态字段数组和多步向导
- 05合并服务端错误与客户端状态
适用场景
- 01构建复杂校验表单
- 02实现多步表单流程
- 03异步校验用户名可用性
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ fusengine/ claude-plugins --skill nextjs-tanstack-form安装后在 Claude Code 中输入/nextjs-tanstack-form确认已加载。
详细介绍
在 Next.js 16 中实现 TanStack Form v1,并原生集成 Server Actions:共享 `formOptions`(客户端和服务端的唯一事实来源)、使用 Zod schema 提供即时客户端反馈并通过 `onServerValidate` 执行数据库检查、使用 `useActionState` 作为 React 19 的表单提交 Hook,并使用 `mergeForm` 将服务端返回的错误与客户端状态合并。
涵盖 Field API(状态 + 处理器)、验证时机(onChange/onBlur/onSubmit/onServer)、动态字段数组和多步骤向导、带防抖的异步验证,以及 shadcn/ui 字段组合。还会介绍表单的 SOLID 文件组织方式(form-options.ts、FormComponent.tsx、form.action.ts),并与 React Hook Form 进行比较。这是 TanStack Form 的 Next.js Server Actions 版本;如需不使用 Next.js 的纯 React 应用,请参阅 react-forms skill。
TanStack Form for Next.js 16
借助 Server Actions 和基于信号的响应性,构建类型安全、高性能的表单。
Agent 工作流(强制)
在进行任何实现之前,必须并行启动 3 个 Agent,每个使用一次 Agent 调用,并设置 name:
- fuse-ai-pilot:explore-codebase - 分析现有表单和验证模式
- fuse-ai-pilot:research-expert - 通过 Context7/Exa 核实最新的 TanStack Form 文档
- mcp__context7__query-docs - 检查 form options 和 field API
实现后,运行 fuse-ai-pilot:sniper 进行验证。
概述
适用场景
- 构建具有复杂验证需求的表单
- 需要集成 Server Actions 来提交表单
- 实现多步骤向导或动态字段数组
- 需要实时异步验证(用户名是否可用)
- 希望表单具备类型安全性和完整的 TypeScript 类型推断
为什么选择 TanStack Form
| 功能 | 优势 |
|---|---|
| 基于信号的状态 | 最大限度减少重新渲染,性能最优 |
| 完整的 TypeScript 支持 | DeepKeys、DeepValue 类型推断 |
| 原生支持 Server Actions | 内置 Next.js 16 集成 |
| Standard Schema(Zod、Valibot…) | 以 schema 为先进行验证,无需适配器 |
| 与框架无关 | React、Vue、Solid 使用相同 API |
| 无头设计 | 适用于任何 UI 库(shadcn/ui) |
关键规则
- 共享 formOptions - 定义一次,在客户端和服务端使用
- 服务端验证 - 在
onServerValidate中执行数据库检查,而不是在客户端 - Zod schema - 提供即时客户端反馈
- useActionState - 用于 Server Actions 的 React 19 Hook
- mergeForm - 将服务端错误与客户端状态合并
- SOLID 路径 - 表单位于
modules/[feature]/src/components/forms/
SOLID 架构
模块结构
按功能模块组织表单:
modules/auth/src/components/forms/- 身份验证表单(登录、注册)modules/auth/src/interfaces/- 表单类型和 schemamodules/auth/src/actions/- 用于提交表单的 Server Actionsmodules/cores/lib/forms/- 共享表单工具
文件组织
| 文件 | 用途 |
|---|---|
form-options.ts | 共享的 formOptions + Zod schema |
FormComponent.tsx | 带字段的客户端表单 UI |
form.action.ts | 带验证的 Server Action |
form.interface.ts | 表单值类型 |
核心概念
Form Options 模式
只定义一次表单配置,并在客户端和服务端共享,确保类型安全与一致性。
Field API
每个字段都有状态(值、错误、已触碰、正在验证)和处理器(handleChange、handleBlur)。
验证级别
- onChange - 用户输入时实时验证
- onBlur - 字段失去焦点时验证
- onSubmit - 提交表单前验证
- onServer - 在 action 中进行服务端验证
错误管理
错误分为字段级和表单级。字段错误使用 field.state.meta.errors,表单错误使用 form.state.errorMap。
参考指南
| 需求 | 参考资料 |
|---|---|
| 初始设置 | installation.md |
| 基本模式 | basic-usage.md、field-api.md |
| 验证 | validation-zod.md、async-validation.md |
| Server Actions | server-actions.md |
| 动态表单 | array-fields.md、multi-step-form.md |
| UI 集成 | shadcn-integration.md |
| TypeScript | typescript.md |
| 迁移 | migration-rhf.md |
| 客户端表单组件 | client-form.md — 在 'use client' 表单组件中接入 useActionState + mergeForm 时加载 |
| 服务端验证 | server-validation.md — 在 Server Action 中编写 createServerValidate + ServerValidateError 时加载 |
最佳实践
- 先定义 schema - Zod schema 同时驱动验证和类型
- 共享 formOptions - 客户端和服务端的唯一事实来源
- 对异步验证进行防抖 - 对 API 调用使用
asyncDebounceMs - form.Subscribe - 有选择地重新渲染提交状态
- 字段组合 - 使用 shadcn/ui 构建可复用的字段组件
- 合并服务端错误 - 使用
mergeForm显示服务端验证错误
与 React Hook Form 对比
| 方面 | TanStack Form | React Hook Form |
|---|---|---|
| 类型安全 | 100%(DeepKeys) | 手动声明类型 |
| 性能 | Signals(开销极低) | Refs(良好) |
| Server Actions | 原生支持 | 手动集成 |
| 包体积 | ~12KB | ~9KB |
| 学习曲线 | 中等 | 低 |
| 使用场景 | 复杂应用 | 标准表单 |
评论
支持 Markdown