React 19 的 Actions 与 useOptimistic 实战
用表单提交与乐观更新两个典型场景,讲清 React 19 的 Server Actions、useActionState 与 useOptimistic。
React 19 围绕「表单与异步状态」引入了一套新原语:Actions、useActionState、useOptimistic 与 useFormStatus。它们共同的目标,是把「提交-等待-更新」这套最常见的交互模式变得可控而优雅。
什么是 Actions
Actions 本质是接收表单数据的异步函数,可以运行在客户端或服务端(Server Actions)。与传统 onSubmit 不同,React 会帮你管理它的待处理状态,自动处理竞态与错误。
async function updateName(prev, formData) {
const name = formData.get('name');
await updateNameApi(name);
return { name };
}
const [state, formAction] = useActionState(updateName, { name: '' });
乐观更新:useOptimistic
「先更新 UI,再等服务器确认」是提升体验的关键。useOptimistic 让你声明一个「预期状态」,在异步完成前先渲染它。
const [optimistic, addOptimistic] = useOptimistic(
messages,
(state, newMsg) => [...state, newMsg]
);
// 提交时先乐观插入,失败时自动回滚
addOptimistic(tempMsg);
await sendMessage(tempMsg);
如果异步操作失败,React 会自动把状态回滚到真实值,省去了手写回滚逻辑的繁琐。
useFormStatus:感知提交状态
嵌套在表单内的子组件,可以通过 useFormStatus 拿到「是否正在提交」,从而禁用按钮、显示 loading,而无需手动传递状态。
function SubmitButton() {
const { pending } = useFormStatus();
return <button disabled={pending}>{pending ? '提交中…' : '提交'}</button>;
}
竞态处理
传统异步 UI 最头疼的是竞态:用户快速点击导致旧响应覆盖新状态。Actions 体系天然解决了这一点——只接受最新一次提交的结果,过期的响应会被自动丢弃。
结语
React 19 的这套新原语,把「乐观更新」「提交状态」「竞态处理」这些过去需要大量样板代码的能力,收敛成了声明式的 API。拥抱它们,你的表单与交互代码会清爽很多。