Next.js 數(shù)據(jù)更新:服務(wù)器函數(shù)創(chuàng)建與調(diào)用教程

2025-03-21 10:06 更新

如何更新數(shù)據(jù)

在 Next.js 中,你可以使用 React 的服務(wù)器函數(shù)(Server Functions)來更新數(shù)據(jù)。 本頁將介紹如何創(chuàng)建和調(diào)用服務(wù)器函數(shù)。

創(chuàng)建服務(wù)器函數(shù)

通過使用 use server 指令可以定義服務(wù)器函數(shù)。你可以將該指令放在一個(gè)異步函數(shù)的頂部來標(biāo)記該函數(shù)為服務(wù)器函數(shù),或者放在一個(gè)單獨(dú)文件的頂部來標(biāo)記該文件的所有導(dǎo)出內(nèi)容。我們建議在大多數(shù)情況下使用單獨(dú)的文件。

  1. 'use server'
  2. export async function createPost(formData: FormData) {}
  3. export async function deletePost(formData: FormData) {}

服務(wù)器組件

通過在函數(shù)體頂部添加 "use server" 指令,可以在服務(wù)器組件中內(nèi)聯(lián)服務(wù)器函數(shù):

  1. export default function Page() {
  2. // 服務(wù)器操作
  3. async function createPost() {
  4. 'use server'
  5. // 更新數(shù)據(jù)
  6. // ...
  7. }
  8. return <></>
  9. }

客戶端組件

在客戶端組件中無法定義服務(wù)器函數(shù)。但是,可以通過從一個(gè)頂部有 "use server" 指令的文件中導(dǎo)入它們來調(diào)用服務(wù)器函數(shù):

  1. 'use server'
  2. export async function createPost() {}

  1. 'use client'
  2. import { createPost } from '@/app/actions'
  3. export function Button() {
  4. return <button formAction={createPost}>創(chuàng)建</button>
  5. }

調(diào)用服務(wù)器函數(shù)

調(diào)用服務(wù)器函數(shù)主要有兩種方式:

  1. 服務(wù)器和客戶端組件中的表單
  2. 客戶端組件中的事件處理程序

表單

React 擴(kuò)展了 HTML 的 <form> 元素,允許通過 HTML action 屬性調(diào)用服務(wù)器函數(shù)。

在表單中調(diào)用時(shí),函數(shù)會自動接收 FormData 對象。你可以使用原生的 FormData 方法提取數(shù)據(jù):

  1. import { createPost } from '@/app/actions'
  2. export function Form() {
  3. return (
  4. <form action={createPost}>
  5. <input type="text" name="title" />
  6. <input type="text" name="content" />
  7. <button type="submit">創(chuàng)建</button>
  8. </form>
  9. )
  10. }

  1. 'use server'
  2. export async function createPost(formData: FormData) {
  3. const title = formData.get('title')
  4. const content = formData.get('content')
  5. // 更新數(shù)據(jù)
  6. // 重新驗(yàn)證緩存
  7. }

小貼士:當(dāng)傳遞給 action 屬性時(shí),服務(wù)器函數(shù)也被稱為服務(wù)器操作

事件處理程序

你可以在客戶端組件中通過使用事件處理程序(如 onClick)來調(diào)用服務(wù)器函數(shù)。

  1. 'use client'
  2. import { incrementLike } from './actions'
  3. import { useState } from 'react'
  4. export default function LikeButton({ initialLikes }: { initialLikes: number }) {
  5. const [likes, setLikes] = useState(initialLikes)
  6. return (
  7. <>
  8. <p>總點(diǎn)贊數(shù): {likes}</p>
  9. <button
  10. onClick={async () => {
  11. const updatedLikes = await incrementLike()
  12. setLikes(updatedLikes)
  13. }}
  14. >
  15. 點(diǎn)贊
  16. </button>
  17. </>
  18. )
  19. }

顯示加載狀態(tài)

在執(zhí)行服務(wù)器函數(shù)時(shí),可以使用 React 的 useActionState 鉤子顯示加載指示器。此鉤子返回一個(gè) pending 布爾值:

  1. 'use client'
  2. import { useActionState } from 'react'
  3. import { createPost } from '@/app/actions'
  4. import { LoadingSpinner } from '@/app/ui/loading-spinner'
  5. export function Button() {
  6. const [state, action, pending] = useActionState(createPost, false)
  7. return (
  8. <button onClick={async () => action()}>
  9. {pending ? <LoadingSpinner /> : '創(chuàng)建帖子'}
  10. </button>
  11. )
  12. }

重新驗(yàn)證緩存

在執(zhí)行更新后,可以通過在服務(wù)器函數(shù)中調(diào)用 revalidatePathrevalidateTag 來重新驗(yàn)證 Next.js 緩存并顯示更新后的數(shù)據(jù):

  1. 'use server'
  2. import { revalidatePath } from 'next/cache'
  3. export async function createPost(formData: FormData) {
  4. // 更新數(shù)據(jù)
  5. // ...
  6. revalidatePath('/posts')
  7. }

重定向

在執(zhí)行更新后,你可能需要將用戶重定向到不同的頁面??梢栽诜?wù)器函數(shù)中調(diào)用 redirect 來實(shí)現(xiàn):

  1. 'use server'
  2. import { redirect } from 'next/navigation'
  3. export async function createPost(formData: FormData) {
  4. // 更新數(shù)據(jù)
  5. // ...
  6. redirect('/posts')
  7. }

API 參考

閱讀 API 參考 ,了解有關(guān)本頁中提到的功能的更多信息。

  • revalidatePath
    revalidatePath 函數(shù)的 API 參考。

  • revalidateTag
    revalidateTag 函數(shù)的 API 參考。

  • 重定向
    重定向函數(shù)的 API 參考。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號