首頁 web前端 js教程 使用 NextJS 掌握 CRUD

使用 NextJS 掌握 CRUD

Dec 15, 2024 pm 05:47 PM

Mastering CRUD with NextJS

在 Web 開發中,CRUD 操作是基本構建塊,對於管理資料至關重要。它們幾乎在每個應用程式中無處不在,從簡單的網站到複雜的企業解決方案。

NestJS Boilerplate 使用者已經能夠評估和使用強大的新工具 - CLI,它允許您自動建立資源及其屬性。使用此工具,您可以進行所有 CRUD 操作並向其中添加必要的字段,而無需手動編寫一行程式碼。同時,正如我們一再宣布的,BC Boilerplates 生態系統包括一個完全相容的 Extective-React-Boilerplate,以提供完整的功能(原則上,它可以是一個完全獨立的解決方案)。現在讓我們從前端角度探討 CRUD 操作。

在具有伺服器端渲染功能的 React 框架 Next.js 中,可以透過增強效能、SEO 和開發人員體驗的功能來有效管理這些操作。之前,我們發表了一篇關於啟動 NextJS 專案的有效方法的文章,現在我們想進一步分析使用 Next.js 中的 API 的細節和細微差別。

眾所周知,CRUD 縮寫代表建立、讀取、更新和刪除。這個概念代表了可以對任何資料執行的基本操作。讓我們考慮使用管理面板使用者的範例來處理 CRUD 操作,其中實現了新增、編輯和刪除使用者等功能,以及檢索有關使用者的信息。下面討論的自訂 React 鉤子,用於處理 React Query 中的資料處理、分頁、錯誤管理等,已經整合到 Extective-React-Boilerplate 中。當然,您可以直接利用這個樣板。在以下部分中,我們將分享我們對實現這些功能的見解。

建立操作

使用案例:提交資料以建立新資源(例如,使用者註冊、新增產品)。
實作: 從表單收集數據,向伺服器發送 POST 請求,處理回應,並相應地更新 UI。

讓我們觀察一個例子。向 API 發出 POST 請求會合併建立新使用者。在下面的程式碼片段中,usePostUserService 鉤子用於封裝此邏輯。我們已經透過定義請求和回應類型來指定建立新使用者的資料結構,但這裡省略這一部分以幫助您集中註意力。您可以在儲存庫 Extective-React-Boilerplate 中查看更詳細的資訊或更完整的圖片,因為此程式碼片段以及以下所有程式碼片段都來自那裡。
因此,我們將建立一個自訂掛鉤 usePostUserService,它使用 useFetch 掛鉤發送 POST 請求。它將用戶資料作為輸入並將其發送到 API:

function usePostUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserPostRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users`, {
        method: "POST",
        body: JSON.stringify(data),
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserPostResponse>);
    },
    [fetch]
  );
}

登入後複製
登入後複製
登入後複製
登入後複製

函數wrapperFetchJsonResponse 將在本文稍後討論「錯誤處理」時進行研究。

讀取操作

使用案例:取得並顯示資源清單或單一資源(例如,取得使用者設定檔和產品清單)。
實作:發送 GET 請求來取得數據,處理載入和錯誤狀態,並在 UI 中呈現數據。

在我們的範例中,讀取資料涉及向 API 發出 GET 請求以取得使用者資料。它可以包括使用分頁、過濾器來取得所有用戶,以及在定義請求 (UsersRequest) 和回應類型 (UsersResponse) 後按 ID 排序或取得單一用戶。
要在自訂 useGetUsersService 掛鉤中取得所有使用者,我們發送帶有用於分頁、過濾器和排序的查詢參數的 GET 請求:

function useGetUsersService() {
  const fetch = useFetch();

  return useCallback(
    (data: UsersRequest, requestConfig?: RequestConfigType) => {
      const requestUrl = new URL(`${API_URL}/v1/users`);
      requestUrl.searchParams.append("page", data.page.toString());
      requestUrl.searchParams.append("limit", data.limit.toString());
      if (data.filters) {
        requestUrl.searchParams.append("filters", JSON.stringify(data.filters));
      }
      if (data.sort) {
        requestUrl.searchParams.append("sort", JSON.stringify(data.sort));
      }

      return fetch(requestUrl, {
        method: "GET",
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UsersResponse>);
    },
    [fetch]
  );
}
登入後複製
登入後複製

用於取得單一使用者 useGetUserService 掛鉤發送 GET 請求以按 ID 取得使用者:

function useGetUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users/${data.id}`, {
        method: "GET",
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserResponse>);
    },
    [fetch]
  );
}
登入後複製
登入後複製

更新操作

使用案例:編輯現有資源(例如,更新使用者資訊、編輯部落格文章)。
實作:收集更新的數據,向伺服器發送 PUT 或 PATCH 請求,處理回應,並更新 UI。

讓我們更新現有用戶,這涉及使用更新的用戶資料向 API 發送 PATCH 請求。為此,在自訂 usePatchUserService 掛鉤中,我們在定義請求 UserPatchRequest 和回應類型 UserPatchResponse 後發送帶有使用者 ID 和更新資料的 PATCH 請求:

function usePatchUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserPatchRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users/${data.id}`, {
        method: "PATCH",
        body: JSON.stringify(data.data),
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserPatchResponse>);
    },
    [fetch]
  );
}
登入後複製

注意:對於部分資​​料更新,使用 PATCH 取代 PUT 更為高級,而 PUT 通常用於完整資源更新。

刪除操作

使用案例:刪除資源(例如,刪除使用者或從清單中刪除項目)。
實作: 向伺服器發送 DELETE 請求,處理回應,並更新 UI 以反映刪除。

在我們的下一個範例中,刪除使用者涉及使用使用者 ID 向您的 API 發送 DELETE 請求。在 useDeleteUsersService 掛鉤中定義請求 (UsersDeleteRequest) 和回應類型 (UsersDeleteResponse) 後,將傳送 DELETE 請求以透過 ID 刪除使用者。

function usePostUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserPostRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users`, {
        method: "POST",
        body: JSON.stringify(data),
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserPostResponse>);
    },
    [fetch]
  );
}

登入後複製
登入後複製
登入後複製
登入後複製

這些鉤子抽象化了發出 HTTP 請求和處理回應的複雜性,使用此方法可確保乾淨且可維護的程式碼庫,因為資料擷取邏輯已封裝並可在元件之間重複使用。

在 Next.js 中檢索數據

好了,我們已經介紹了處理CRUD操作的例子,下面我們來仔細看看Next.js提供的獲取資料的方法,因為它作為一個框架,在React的基礎上增加了它的功能和優化。很明顯,Next.js 除了CSR(客戶端渲染)之外,還提供了高級功能,如SSR(伺服器端渲染)、SSG(靜態站點生成)、內建API 路由和混合渲染。那麼,讓我們討論一下 Next.js 和 React 中檢索資料的共通點和差異。

只要 React 應用程式是純粹的客戶端,那麼資料獲取就會在初始頁面載入後發生在客戶端上。對於每次載入頁面時都需要取得資料的動態頁面,

更適合使用SSR,在這種情況下,資料是在請求時在伺服器上取得的。 對於 SSG,它適用於資料不經常更改的靜態頁面,資料是在建置時取得的。因此,getStaticProps 方法可以幫助我們
在建置時取得資料 (SSG)。如果我們需要基於動態路由和建置時取得的資料來預先渲染頁面,則 getStaticPaths 方法允許執行此操作。它與 getStaticProps 結合使用在建置時產生動態路由。需要注意的是,從 Next 14 開始,我們可以直接在元件中發出請求,而無需這些方法,從而提供了更多「React 體驗」。

使用 useQuery 進行客戶端資料取得可用於需要在客戶端取得資料的互動式元件,其初始狀態是從伺服器端取得的資料中取得的。對於獲取頻繁變更的資料或新增客戶端互動性,useSWR 策略非常有用。它是一個用於客戶端資料擷取、快取和重新驗證的 React 鉤子。它允許在客戶端獲取數據,通常是在初始頁面加載之後。儘管如此,它不會在構建時或在 SSR 伺服器上獲取數據,但它可以在需要時重新驗證並獲取新數據。

為了總結有關上述方法的信息,我們可以看一下表格,該表格全面概述了 Next.js 中的不同數據獲取方法,突出顯示了它們各自的時間和用例。

Method Data Fetching Timing Use Case
getStaticPaths Static Site Generation (SSG) At build time Pre-render pages for dynamic routes based on data available at build time.
getStaticProps Static Site Generation (SSG) At build time Pre-render pages with static content at build time. Ideal for content that doesn't change frequently.
getServerSideProps Server-Side Rendering (SSR) On each request Fetch data on the server for each request, providing up-to-date content. Ideal for dynamic content that changes frequently.
useQuery Client-Side Rendering (CSR) After the initial page load Fetch initial data server-side, hydrate, reduce redundant network requests, Background Refetching.
useSWR Client-Side Rendering (CSR) After the initial page load Fetch and revalidate data on the client-side, suitable for frequently changing data.

將 React Query 與 Next.js 結合使用

React Query 提供了用於獲取、快取、同步和更新伺服器狀態的鉤子,使其成為處理 React 和 Next.js 應用程式中資料的絕佳工具。使用它的主要好處是:

  • 高效率的資料取得:它處理快取和後台資料同步,減少冗餘的網路請求。
  • 自動重新獲取:資料過時時可以在背景自動重新獲取,確保UI始終顯示最新資訊。
  • 整合錯誤處理:內建對處理錯誤和重試的支持,使管理網路故障和伺服器錯誤變得更加容易。
  • 樂觀更新: useMutation 鉤子透過提供一種簡單的方法來處理樂觀 UI 變更和伺服器請求失敗時的回滾邏輯,從而提供樂觀更新。
  • 易於與 Next.js 整合:它可以與 getStaticProps 或 getServerSideProps(如果需要)等其他 Next.js 資料擷取方法無縫整合。
  • 檢查查詢和突變:ReactQueryDevtools 工具提供了查看所有活動查詢和突變的狀態、資料、錯誤和其他詳細資訊的可能性,並在應用程式運行時即時觀察查詢狀態更新.

查詢客戶端提供者

QueryClientProvider 是一個上下文提供者元件,它向 React 元件樹提供 QueryClient 實例。這個實例對於使用像 useQuery 這樣的鉤子是必需的。 要進行設置,需要將其放置在組件樹的根部,並為查詢和突變配置全域設置,例如重試行為、快取時間等。之後,它會初始化 React Query 客戶端並使其在整個應用程式中可用。

function usePostUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserPostRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users`, {
        method: "POST",
        body: JSON.stringify(data),
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserPostResponse>);
    },
    [fetch]
  );
}

登入後複製
登入後複製
登入後複製
登入後複製

那麼,為什麼要把它加到專案中呢?它有益於:

  • 所有查詢和突變的集中配置。
  • 易於設定並整合到現有的 React 應用程式中。
  • 啟用快取、後台重新取得和查詢失效等功能。

React 查詢開發工具

React Query 提供的另一個重要功能是 React Query Devtools - 一個用於檢查和偵錯 React Query 狀態的開發工具。它可以輕鬆添加到您的應用程式中,並透過瀏覽器擴充功能或作為元件進行訪問,如前面的範例所示。
在開發過程中,React Query Devtools 可用於檢查單一查詢和突變,了解為什麼某些查詢會預取並監視查詢快取的狀態,並查看它如何隨著時間的推移而演變。

分頁和無限滾動

要使用庫中的功能實現分頁控製或無限滾動,useInfiniteQuery 是完美的選擇。首先,我們產生唯一的鍵,用於在 React Query 中快取和檢索查詢。這裡的 by 方法根據排序和過濾選項創建唯一鍵。

function usePostUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserPostRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users`, {
        method: "POST",
        body: JSON.stringify(data),
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserPostResponse>);
    },
    [fetch]
  );
}

登入後複製
登入後複製
登入後複製
登入後複製

為此,我們將使用 React Query 中的 useInfiniteQuery 函數,並採用上面讀取操作部分中討論的 useGetUsersService 掛鉤。

function useGetUsersService() {
  const fetch = useFetch();

  return useCallback(
    (data: UsersRequest, requestConfig?: RequestConfigType) => {
      const requestUrl = new URL(`${API_URL}/v1/users`);
      requestUrl.searchParams.append("page", data.page.toString());
      requestUrl.searchParams.append("limit", data.limit.toString());
      if (data.filters) {
        requestUrl.searchParams.append("filters", JSON.stringify(data.filters));
      }
      if (data.sort) {
        requestUrl.searchParams.append("sort", JSON.stringify(data.sort));
      }

      return fetch(requestUrl, {
        method: "GET",
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UsersResponse>);
    },
    [fetch]
  );
}
登入後複製
登入後複製

這裡的 QueryFn 根據當前頁面、過濾器和排序參數檢索用戶數據,而 getNextPageParam 函數根據上一頁的響應確定要獲取的下一頁。當使用者滾動或請求更多資料時,useInfiniteQuery 會根據 nextPage 參數自動檢索下一組資料 - 這就是無限滾動發生的方式。查詢的快取時間由 gcTime 參數設定。

總的來說,React Query 提供了一個用於管理和偵錯 React 應用程式中伺服器狀態的全面解決方案。 QueryClientProvider 確保所有查詢和突變的集中且一致的配置,而 ReactQueryDevtools 提供強大的工具用於在開發過程中檢查和理解查詢行為。

錯誤處理

實現 CRUD 操作始終需要適當的錯誤處理,以確保使用者友善性和應用程式可靠性。伺服器錯誤通常與客戶端請求處理失敗、伺服器程式碼錯誤、資源過載、基礎架構設定錯誤或外部服務故障有關。對於錯誤處理,Extective-react-boilerplate 建議使用wrapperFetchJsonResponse 函數:

function useGetUserService() {
  const fetch = useFetch();
  return useCallback(
    (data: UserRequest, requestConfig?: RequestConfigType) => {
      return fetch(`${API_URL}/v1/users/${data.id}`, {
        method: "GET",
        ...requestConfig,
      }).then(wrapperFetchJsonResponse<UserResponse>);
    },
    [fetch]
  );
}
登入後複製
登入後複製

結論

在本文中,我們介紹了基本的 CRUD 操作,探索了 NextJS 中的資料檢索技術。我們深入研究了使用 React Query 來管理狀態,也概述了 QueryClientProvider 和 ReactQueryDevtools 用於偵錯和最佳化資料檢索的功能。此外,我們還討論瞭如何實現分頁和無限滾動來處理大型資料集,並解決了錯誤處理問題,使您的應用程式更具彈性並確保流暢的使用者體驗。

透過遵循本文中概述的範例和技術,您現在應該能夠在 NextJS 專案中處理 CRUD 操作。或者,您可以為您的專案使用我們的 Extective-react-boilerplate 範本。它具有完全相容的 Nestjs-boilerplate 後端,可以在幾分鐘內實現使用 CRUD 操作的能力,而無需使用 CLI 編寫一行程式碼,我們已在此處和此處針對實體關係更詳細地介紹了這一點。不斷嘗試,隨時了解最佳實踐,如果您發現它有用,歡迎嘗試此樣板。

我們的 BC Boilerplates 團隊始終在尋找加強開發的方法。我們很想聽聽您對 GitHub 討論或下面評論的想法。

本文全部歸功於 Olena Vlasenko 和 Vlad Shchepotin ??

以上是使用 NextJS 掌握 CRUD的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

See all articles