概览useFormStatus 提供当前提交状态,useFormState 能以 Server Actions 为后端整合表单逻辑。两者配合可实现无刷新提交与状态回传,并在 SSR/CSR 下保持一致的行为与可访问性。Server Actions 与表单app/actions.ts'use server'
export async function submit(data: FormData) {
const email = String(data.get('email') || '')
await new Promise((r) => setTimeout(r, 600))
const ok = /@/.test(email)
return { ok }
}
客户端组件'use client'
import { useFormStatus, useFormState } from 'react-dom'
import { submit } from '../actions'
function SubmitButton() {
const { pending } = useFormStatus()
return <button disabled={pending}>{pending ? '提交中…' : '提交'}</button>
}
export default function Form() {
const [state, action] = useFormState(async (_prev, formData) => {
'use server'
return submit(formData)
}, { ok: false })
return (
<form action={action} aria-describedby="status">
<label htmlFor="email">邮箱</label>
<input id="email" name="email" type="email" required />
<SubmitButton />
<p id="status" role="status">{state.ok ? '已提交' : '请输入邮箱'}</p>
</form>
)
}
治理要点将状态提示用 `role="status"` 输出,保障读屏器反馈。使用 `disabled` 与退避策略避免重复提交与竞态。与缓存标签或路径失效协作,在成功后触发局部刷新。验证与指标React:19.0+;Next.js:15.0+;Node.js:20.x无刷新提交成功率稳定;在弱网下提交反馈延迟 < 1s

发表评论 取消回复