概览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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部