表单与数据变更
表单让您能够在网页应用中创建和更新数据。Next.js 通过 服务端操作 (Server Actions) 提供了强大的表单提交与数据变更处理方案。
示例
服务端操作原理
使用服务端操作时,您无需手动创建 API 端点,而是直接定义可在组件中调用的异步服务端函数。
🎥 观看: 通过应用路由学习表单与数据变更 → YouTube (10分钟)。
服务端操作可在服务端组件中定义,或从客户端组件调用。在服务端组件中定义操作可使表单在无 JavaScript 环境下正常工作,实现渐进增强。
在 next.config.js
中启用服务端操作:
须知:
- 从服务端组件调用服务端操作的表单可在无 JavaScript 环境下运行。
- 从客户端组件调用服务端操作的表单会在 JavaScript 未加载时排队提交,优先保证客户端水合。
- 服务端操作继承所在页面或布局的 运行时环境。
- 服务端操作兼容完全静态的路由(包括使用 ISR 重新验证数据)。
重新验证缓存数据
服务端操作与 Next.js 缓存与重新验证 架构深度集成。表单提交时,服务端操作可更新缓存数据并重新验证应变更的缓存键。
不同于传统应用每个路由只能有一个表单,服务端操作支持每个路由多个操作。此外,表单提交时浏览器无需刷新。在单次网络往返中,Next.js 可同时返回更新后的 UI 和刷新数据。
查看下方 通过服务端操作重新验证数据 的示例。
示例
纯服务端表单
要创建纯服务端表单,需在服务端组件中定义服务端操作。操作可内联定义(在函数顶部添加 "use server"
指令),或在单独文件中定义(文件顶部添加指令)。
须知:
<form action={create}>
接收 FormData 数据类型。上例中通过 HTMLform
提交的 FormData 可在服务端操作create
中访问。
重新验证数据
服务端操作允许您按需使 Next.js 缓存 失效。您可以使用 revalidatePath
使整个路由段失效:
或使用 revalidateTag
通过缓存标签使特定数据获取失效:
重定向
若要在服务端操作完成后重定向用户,可使用 redirect
跳转到任意绝对或相对 URL:
表单验证
推荐使用 required
和 type="email"
等 HTML 验证进行基础表单验证。
如需高级服务端验证,可使用 zod 等模式验证库验证解析后的表单数据结构:
显示加载状态
使用 useFormStatus
钩子显示表单在服务端提交时的加载状态。该钩子只能作为使用服务端操作的 form
元素的子组件使用。
例如以下提交按钮:
<SubmitButton />
可在包含服务端操作的表单中使用:
错误处理
服务端操作 (Server Actions) 也可以返回可序列化对象。例如,您的服务端操作可以处理创建新项目时的错误:
然后,在客户端组件 (Client Component) 中,您可以读取这个值并显示错误信息。
乐观更新 (Optimistic Updates)
使用 useOptimistic
在服务端操作完成前乐观地更新 UI,而无需等待响应:
设置 Cookies
您可以在服务端操作中使用 cookies
函数设置 cookie:
读取 Cookies
您可以在服务端操作中使用 cookies
函数读取 cookie:
删除 Cookies
您可以在服务端操作中使用 cookies
函数删除 cookie:
查看更多示例了解如何从服务端操作中删除 cookie。