国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

使用 NextJS 掌握 CRUD

Dec 15, 2024 pm 05:47 PM

Mastering CRUD with NextJS

在 Web 開發(fā)中,CRUD 操作是基本構(gòu)建塊,對於管理資料至關(guān)重要。它們幾乎在每個(gè)應(yīng)用程式中無處不在,從簡單的網(wǎng)站到複雜的企業(yè)解決方案。

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

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

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

建立操作

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

讓我們觀察一個(gè)例子。向 API 發(fā)出 POST 請求會合併建立新使用者。在下面的程式碼片段中,usePostUserService 鉤子用於封裝此邏輯。我們已經(jīng)透過定義請求和回應(yīng)類型來指定建立新使用者的資料結(jié)構(gòu),但這裡省略這一部分以幫助您集中註意力。您可以在儲存庫 Extective-React-Boilerplate 中查看更詳細(xì)的資訊或更完整的圖片,因?yàn)榇顺淌酱a片段以及以下所有程式碼片段都來自那裡。
因此,我們將建立一個(gè)自訂掛鉤 usePostUserService,它使用 useFetch 掛鉤發(fā)送 POST 請求。它將用戶資料作為輸入並將其發(fā)送到 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]
  );
}

函數(shù)wrapperFetchJsonResponse 將在本文稍後討論「錯誤處理」時(shí)進(jìn)行研究。

讀取操作

使用案例:取得並顯示資源清單或單一資源(例如,取得使用者設(shè)定檔和產(chǎn)品清單)。
實(shí)作:發(fā)送 GET 請求來取得數(shù)據(jù),處理載入和錯誤狀態(tài),並在 UI 中呈現(xiàn)數(shù)據(jù)。

在我們的範(fàn)例中,讀取資料涉及向 API 發(fā)出 GET 請求以取得使用者資料。它可以包括使用分頁、過濾器來取得所有用戶,以及在定義請求 (UsersRequest) 和回應(yīng)類型 (UsersResponse) 後按 ID 排序或取得單一用戶。
要在自訂 useGetUsersService 掛鉤中取得所有使用者,我們發(fā)送帶有用於分頁、過濾器和排序的查詢參數(shù)的 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 掛鉤發(fā)送 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]
  );
}

更新操作

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

讓我們更新現(xiàn)有用戶,這涉及使用更新的用戶資料向 API 發(fā)送 PATCH 請求。為此,在自訂 usePatchUserService 掛鉤中,我們在定義請求 UserPatchRequest 和回應(yīng)類型 UserPatchResponse 後發(fā)送帶有使用者 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 通常用於完整資源更新。

刪除操作

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

在我們的下一個(gè)範(fàn)例中,刪除使用者涉及使用使用者 ID 向您的 API 發(fā)送 DELETE 請求。在 useDeleteUsersService 掛鉤中定義請求 (UsersDeleteRequest) 和回應(yīng)類型 (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]
  );
}

這些鉤子抽象化了發(fā)出 HTTP 請求和處理回應(yīng)的複雜性,使用此方法可確保乾淨(jìng)且可維護(hù)的程式碼庫,因?yàn)橘Y料擷取邏輯已封裝並可在元件之間重複使用。

在 Next.js 中檢索數(shù)據(jù)

好了,我們已經(jīng)介紹了處理CRUD操作的例子,下面我們來仔細(xì)看看Next.js提供的獲取資料的方法,因?yàn)樗鳛橐粋€(gè)框架,在React的基礎(chǔ)上增加了它的功能和優(yōu)化。很明顯,Next.js 除了CSR(客戶端渲染)之外,還提供了高級功能,如SSR(伺服器端渲染)、SSG(靜態(tài)站點(diǎn)生成)、內(nèi)建API 路由和混合渲染。那麼,讓我們討論一下 Next.js 和 React 中檢索資料的共通點(diǎn)和差異。

只要 React 應(yīng)用程式是純粹的客戶端,那麼資料獲取就會在初始頁面載入後發(fā)生在客戶端上。對於每次載入頁面時(shí)都需要取得資料的動態(tài)頁面,

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

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

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

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 結(jié)合使用

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

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

查詢客戶端提供者

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

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]
  );
}

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

  • 所有查詢和突變的集中配置。
  • 易於設(shè)定並整合到現(xiàn)有的 React 應(yīng)用程式中。
  • 啟用快取、後臺重新取得和查詢失效等功能。

React 查詢開發(fā)工具

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

分頁和無限滾動

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

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 函數(shù),並採用上面讀取操作部分中討論的 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 根據(jù)當(dāng)前頁面、過濾器和排序參數(shù)檢索用戶數(shù)據(jù),而 getNextPageParam 函數(shù)根據(jù)上一頁的響應(yīng)確定要獲取的下一頁。當(dāng)使用者滾動或請求更多資料時(shí),useInfiniteQuery 會根據(jù) nextPage 參數(shù)自動檢索下一組資料 - 這就是無限滾動發(fā)生的方式。查詢的快取時(shí)間由 gcTime 參數(shù)設(shè)定。

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

錯誤處理

實(shí)現(xiàn) CRUD 操作始終需要適當(dāng)?shù)腻e誤處理,以確保使用者友善性和應(yīng)用程式可靠性。伺服器錯誤通常與客戶端請求處理失敗、伺服器程式碼錯誤、資源過載、基礎(chǔ)架構(gòu)設(shè)定錯誤或外部服務(wù)故障有關(guān)。對於錯誤處理,Extective-react-boilerplate 建議使用wrapperFetchJsonResponse 函數(shù):

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]
  );
}

結(jié)論

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

透過遵循本文中概述的範(fàn)例和技術(shù),您現(xiàn)在應(yīng)該能夠在 NextJS 專案中處理 CRUD 操作?;蛘撸梢詾槟膶0甘褂梦覀兊?Extective-react-boilerplate 範(fàn)本。它具有完全相容的 Nestjs-boilerplate 後端,可以在幾分鐘內(nèi)實(shí)現(xiàn)使用 CRUD 操作的能力,而無需使用 CLI 編寫一行程式碼,我們已在此處和此處針對實(shí)體關(guān)係更詳細(xì)地介紹了這一點(diǎn)。不斷嘗試,隨時(shí)了解最佳實(shí)踐,如果您發(fā)現(xiàn)它有用,歡迎嘗試此樣板。

我們的 BC Boilerplates 團(tuán)隊(duì)始終在尋找加強(qiáng)開發(fā)的方法。我們很想聽聽您對 GitHub 討論或下面評論的想法。

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

以上是使用 NextJS 掌握 CRUD的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯誤。

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

See all articles