关于 nextjs-tanstack-form
nextjs-tanstack-form 是面向 Next.js 16 项目的 TanStack Form 实践指南,适用于构建复杂且具备类型安全的表单。它说明如何结合 Server Actions、共享配置和客户端与服务端验证,并涵盖动态字段及多步表单。
主要功能
- 01通过共享 formOptions 统一客户端与服务端配置
- 02结合 Zod 和 Server Actions 验证
- 03使用 mergeForm 合并服务端错误
- 04支持动态字段数组与多步表单
- 05涵盖异步验证和 shadcn/ui 字段组合
适用场景
- 01在 Next.js 16 中构建 Server Actions 表单
- 02实现客户端即时反馈和服务端数据库校验
- 03开发动态字段表单或多步向导
- 04集成防抖异步验证与可复用字段
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ fusengine/ agents --skill nextjs-tanstack-form安装后在 Claude Code 中输入/nextjs-tanstack-form确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/array-fields.mdasync-validation.mdbasic-usage.mdclient-form.mdfield-api.mdform-state.mdinstallation.mdmigration-rhf.mdmulti-step-form.mdperformance.mdserver-actions.mdserver-validation.mdshadcn-integration.mdtesting.mdtypescript.mdvalidation-zod.md详细介绍
涵盖 Field API(状态 + 处理器)、验证时机(onChange/onBlur/onSubmit/onServer)、动态字段数组和多步向导、防抖异步验证,以及 shadcn/ui 字段组合。还介绍表单的 SOLID 文件组织方式(form-options.ts、FormComponent.tsx、form.action.ts),并与 React Hook Form 进行比较。这是适用于 Next.js 的 TanStack Form Server Actions 版本;如需了解不使用 Next.js 的纯 React 应用,请参阅 react-forms skill。
Next.js 16 中的 TanStack Form
借助 Server Actions 和基于信号的响应机制,构建类型安全、高性能的表单。
Agent 工作流(强制)
在进行任何实现之前,必须并行启动 3 个 Agent,每个使用一个带有 name 的 Agent 调用:
- fuse-ai-pilot:explore-codebase - 分析现有表单和验证模式
- fuse-ai-pilot:research-expert - 通过 Context7/Exa 核实最新的 TanStack Form 文档
- mcp__context7__query-docs - 检查表单选项和 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 schemas - 提供即时客户端反馈
- useActionState - 用于 Server Actions 的 React 19 钩子
- 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 | 50 |
FormComponent.tsx | 带字段的客户端表单 UI | 80 |
form.action.ts | 带验证的 Server Action | 30 |
form.interface.ts | 表单值的类型 | 30 |
核心概念
表单选项模式
只定义一次表单配置,并在客户端和服务端共享,确保类型安全和一致性。
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 |
| 学习曲线 | 中等 | 低 |
| 使用场景 | 复杂应用 | 标准表单 |