如何更新資料
您可以使用 React 的 伺服器函式 (Server Functions) 在 Next.js 中更新資料。本頁將介紹如何建立和呼叫伺服器函式。
伺服器函式
伺服器函式是在伺服器端執行的非同步函式。由於是透過客戶端發送網路請求來呼叫,伺服器函式本質上是非同步的。當作為 action 的一部分被呼叫時,它們也被稱為伺服器動作 (Server Actions)。
按照慣例,action 是傳遞給 startTransition 的非同步函式。在以下情況下,伺服器函式會自動被 startTransition 包裝:
- 透過
action屬性傳遞給<form> - 透過
formAction屬性傳遞給<button> - 傳遞給
useActionState
建立伺服器函式
可以使用 use server 指令來定義伺服器函式。您可以將指令放在非同步函式的頂部以標記該函式為伺服器函式,或放在獨立檔案的頂部以標記該檔案的所有導出。
export async function createPost(formData: FormData) {
'use server'
const title = formData.get('title')
const content = formData.get('content')
// 更新資料
// 重新驗證快取
}
export async function deletePost(formData: FormData) {
'use server'
const id = formData.get('id')
// 更新資料
// 重新驗證快取
}export async function createPost(formData) {
'use server'
const title = formData.get('title')
const content = formData.get('content')
// 更新資料
// 重新驗證快取
}
export async function deletePost(formData) {
'use server'
const id = formData.get('id')
// 更新資料
// 重新驗證快取
}伺服器元件
可以在伺服器元件中內聯伺服器函式,方法是將 "use server" 指令添加到函式主體的頂部:
export default function Page() {
// 伺服器動作
async function createPost(formData: FormData) {
'use server'
// ...
}
return <></>
}export default function Page() {
// 伺服器動作
async function createPost(formData: FormData) {
'use server'
// ...
}
return <></>
}客戶端元件
無法在客戶端元件中定義伺服器函式。但是,您可以透過從頂部帶有 "use server" 指令的檔案中導入它們來在客戶端元件中呼叫:
'use server'
export async function createPost() {}'use server'
export async function createPost() {}呼叫伺服器函式
有兩種主要方式可以呼叫伺服器函式:
表單
React 擴展了 HTML <form> 元素,允許使用 HTML action 屬性呼叫伺服器函式。
當在表單中呼叫時,函式會自動接收 FormData 物件。您可以使用原生的 FormData 方法提取資料:
import { createPost } from '@/app/actions'
export function Form() {
return (
<form action={createPost}>
<input type="text" name="title" />
<input type="text" name="content" />
<button type="submit">建立</button>
</form>
)
}import { createPost } from '@/app/actions'
export function Form() {
return (
<form action={createPost}>
<input type="text" name="title" />
<input type="text" name="content" />
<button type="submit">建立</button>
</form>
)
}'use server'
export async function createPost(formData: FormData) {
const title = formData.get('title')
const content = formData.get('content')
// 更新資料
// 重新驗證快取
}'use server'
export async function createPost(formData) {
const title = formData.get('title')
const content = formData.get('content')
// 更新資料
// 重新驗證快取
}小知識: 當傳遞給
action屬性時,伺服器函式也被稱為伺服器動作。
事件處理器
您可以在客戶端元件中使用 onClick 等事件處理器來呼叫伺服器函式。
範例
顯示處理中狀態
在執行伺服器函式時,您可以使用 React 的 useActionState 鉤子顯示載入指示器。該鉤子會返回一個 pending 布林值:
重新驗證快取
執行更新後,您可以在伺服器函式中呼叫 revalidatePath 或 revalidateTag 來重新驗證 Next.js 快取並顯示更新後的資料:
import { revalidatePath } from 'next/cache'
export async function createPost(formData: FormData) {
'use server'
// 更新資料
// ...
revalidatePath('/posts')
}import { revalidatePath } from 'next/cache'
export async function createPost(formData) {
'use server'
// 更新資料
// ...
revalidatePath('/posts')
}重新導向
您可能希望在執行更新後將使用者重新導向到不同頁面。您可以在伺服器函式中呼叫 redirect 來實現:
'use server'
import { redirect } from 'next/navigation'
export async function createPost(formData: FormData) {
// 更新資料
// ...
redirect('/posts')
}'use server'
import { redirect } from 'next/navigation'
export async function createPost(formData) {
// 更新資料
// ...
redirect('/posts')
}