0Pricing
React Academy · 课时

useActionState 与 useFormStatus

使用 useActionState 跟踪待处理状态和错误,并在请求进行期间使用 useFormStatus 禁用提交按钮

useActionState 与 useFormStatus 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

认识 useActionState

useActionState(action, initialState) 是 React 19 中的一个钩子,它包装服务器操作,以跟踪其在多次提交之间的状态。它接收操作函数和初始状态值,并返回一个可用于驱动完整表单体验的元组。

返回元组

该钩子返回 [state, formAction, isPending]。state 保存操作最近一次的返回值(初始值为 null 或您提供的初始值)。formAction 是应传递给表单的包装后操作。操作在服务器上执行期间,isPending 的值为 true。

跟踪多次提交之间的状态

每次提交表单时,服务器操作都会运行,其返回值会成为新的 state。首次渲染时,state 等于 initialState。这样一来,您可以根据是否有过之前的提交以及这些提交返回的内容,轻松显示不同的界面。

显示内联验证错误

如果服务器操作返回 { errors: { email: 'Invalid email' } },您可以内联显示错误:{state.errors?.email && <p>{state.errors.email}</p>}。由于状态会在重新渲染之间保持不变,错误消息会一直显示,直到下一次成功提交替换该状态。

显示成功消息

当操作返回 { success: true } 时,组件可以渲染成功消息:{state?.success && <p>Form submitted!</p>}。您可以根据状态值有条件地隐藏表单,或用成功消息替代表单。

认识 useFormStatus

useFormStatus() 是一个读取最近祖先 <form> 元素待处理状态的钩子。它会返回一个包含 { pending: boolean } 的对象。此钩子必须在表单的子组件中使用,而不能在渲染表单本身的组件中使用。

位置限制存在的原因

之所以规定必须在表单内部使用 useFormStatus,是因为该钩子会从其上方的 React 树中读取表单上下文。如果在渲染表单的同一个组件中调用它,那么它将是表单的兄弟节点,而不是后代节点,因此无法访问表单的状态。

创建提交按钮组件

标准模式是将提交按钮提取为独立组件:function SubmitButton() { const { pending } = useFormStatus(); return <button disabled={pending}>Submit</button>; }。然后将此组件放置在表单内部,使其能够访问表单的待处理状态。

禁用提交按钮

在提交按钮上设置 disabled={pending} 可以防止重复提交。当用户点击提交且服务器操作正在执行时,pending 为 true,按钮会被禁用且无法点击。操作完成后,pending 恢复为 false,按钮重新启用。

组合使用两个钩子

完整的表单用户体验模式会组合使用两个钩子:表单组件中的 useActionState 跟踪操作结果并提供 formAction,而子组件 SubmitButton 内的 useFormStatus 跟踪待处理状态。两者结合后,可以提供验证错误显示和响应迅速的提交按钮。

使用 useOptimistic 实现乐观界面

若要获得更加灵敏的体验,可以将 useOptimistic 与 useActionState 配合使用。您可以在服务器响应之前立即使用预期结果更新界面,然后在实际响应到达时进行协调。这种模式常用于点赞按钮、待办事项列表和其他需要快速反馈的交互。

useFormStatus 的调用位置

必须在哪里调用 useFormStatus 才能使其正常工作?

课程回顾

useActionState(action, initialState) 返回 [state, formAction, isPending],用于跟踪服务器操作的结果。状态保存操作的返回值,因此可以显示内联错误和成功消息。useFormStatus() 在表单的子组件中提供 { pending },从而支持响应迅速的提交按钮。两个钩子结合使用,可以构建完整且易于访问的表单体验。

常见问题解答

「useActionState 与 useFormStatus」课时是免费的吗?

是的 — 「useActionState 与 useFormStatus」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「useActionState 与 useFormStatus」这节课中我会学到什么?

使用 useActionState 跟踪待处理状态和错误,并在请求进行期间使用 useFormStatus 禁用提交按钮 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「useActionState 与 useFormStatus」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. React 19 与 Next.js 中的服务器操作
  2. 表单操作:用变更操作替代 API 路由
  3. useActionState 与 useFormStatus
  4. 使用服务器操作实现渐进增强
← 返回 React Academy