TanStack Form 分步向导模式

使用 TanStack Form 构建复杂多步表单,涵盖步骤导航、逐级验证、状态持久化以及进度追踪的实现方法。

Sam Rivera
Sam Rivera
June 1, 202611 min read
其他语言:Deutsch · English

TL;DR: 多步表单(向导)将冗长表单拆分为易消化的步骤。TanStack Form 的字段级验证、计算字段和表单状态让这一模式变得自然。本文涵盖带验证守卫的步骤导航、逐级部分提交、跨步骤状态持久化,以及响应字段完成状态的进度指示器。


引言

冗长表单会损害转化率。包含 20 个字段的结账流程,弃单率可达 60%。解决方案:将其拆分为 4-5 个步骤,并配以进度指示器。但多步表单也引入了复杂性——逐级验证、返回导航时的状态持久化,以及部分服务端提交。

TanStack Form 粒度化的字段 API 让这一切变得可控。每个步骤独立验证,字段值响应式持久化,只有在最后一步才提交全部数据。


使用 TanStack Form 构建向导状态

如需 TanStack Form API 的完整概述,请参阅 TanStack Form 完全指南。向导模式建立在其核心表单状态和字段级验证之上:

tsx
import { useForm } from '@tanstack/react-form'
import { z } from 'zod'

const wizardSchema = z.object({
  // Step 1: Account
  email: z.string().email(),
  password: z.string().min(8),
  // Step 2: Profile
  fullName: z.string().min(2),
  companyName: z.string().min(1),
  // Step 3: Preferences
  role: z.enum(['developer', 'manager', 'founder']),
  teamSize: z.enum(['1', '2-10', '11-50', '50+']),
})

function OnboardingWizard() {
  const [step, setStep] = useState(1)
  const form = useForm({
    defaultValues: { email: '', password: '', fullName: '', companyName: '', role: 'developer', teamSize: '1' },
    validators: { onSubmit: wizardSchema },
  })

步骤验证

tsx
  const canProceed = useMemo(() => {
    if (step === 1) return form.state.values.email && form.state.values.password.length >= 8
    if (step === 2) return form.state.values.fullName && form.state.values.companyName
    return true
  }, [step, form.state.values])

  return (
    <div>
      <ProgressBar current={step} total={3} />
      {step === 1 && <AccountStep form={form} />}
      {step === 2 && <ProfileStep form={form} />}
      {step === 3 && <PreferencesStep form={form} />}
      <div className="flex justify-between mt-6">
        {step > 1 && <button onClick={() => setStep(step - 1)}>Back</button>}
        {step < 3
          ? <button disabled={!canProceed} onClick={() => setStep(step + 1)}>Next</button>
          : <form.Subscribe selector={(state) => state.isSubmitting}>
              {(isSubmitting) => (
                <button disabled={isSubmitting} onClick={() => form.handleSubmit()}>
                  {isSubmitting ? 'Submitting...' : 'Complete Setup'}
                </button>
              )}
            </form.Subscribe>
        }
      </div>
    </div>
  )
}

向导模式决策指南

选择合适的表单模式取决于具体用例。如需深入了解表单设计 UX 模式,请参阅我们的专项指南。

模式适用场景UX 收益
单步长表单字段 < 10,熟悉的数据完成快速
多步向导字段 10-30,不熟悉的数据降低认知负担
条件分支用户画像影响字段集提升相关性
逐级自动保存关键数据、长会话场景数据零丢失
并排预览配置密集型场景即时反馈

结语

TanStack Form 的逐字段验证与响应式状态机制,使多步向导的实现变得简洁明了。该模式能有效降低复杂入职流程、结账流程和问卷流程的表单弃填率。如需完整的入职策略,请参阅 SaaS 客户入职最佳实践 和 注册流程优化。