国产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)建塊,對于管理數(shù)據(jù)至關重要。它們幾乎在每個應用程序中無處不在,從簡單的網(wǎng)站到復雜的企業(yè)解決方案。

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

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

眾所周知,CRUD 縮寫代表創(chuàng)建、讀取、更新和刪除。這個概念代表了可以對任何數(shù)據(jù)執(zhí)行的基本操作。讓我們考慮使用管理面板用戶的示例來處理 CRUD 操作,其中實現(xiàn)了添加、編輯和刪除用戶等功能,以及檢索有關用戶的信息。下面討論的自定義 React 鉤子,用于處理 React Query 中的數(shù)據(jù)處理、分頁、錯誤管理等,已經(jīng)集成到 Extective-React-Boilerplate 中。當然,您可以直接利用這個樣板。在以下部分中,我們將分享我們對實現(xiàn)這些功能的見解。

創(chuàng)建操作

用例:提交數(shù)據(jù)以創(chuàng)建新資源(例如,用戶注冊、添加新產(chǎn)品)。
實現(xiàn): 從表單收集數(shù)據(jù),向服務器發(fā)送 POST 請求,處理響應,并相應地更新 UI。

讓我們觀察一個例子。向 API 發(fā)出 POST 請求會合并創(chuàng)建新用戶。在下面的代碼片段中,usePostUserService 鉤子用于封裝此邏輯。我們已經(jīng)通過定義請求和響應類型來指定創(chuàng)建新用戶的數(shù)據(jù)結(jié)構(gòu),但這里省略這一部分以幫助您集中注意力。您可以在存儲庫 Extective-React-Boilerplate 中查看更詳細的信息或更完整的圖片,因為此代碼片段以及以下所有代碼片段都來自那里。
因此,我們將創(chuàng)建一個自定義掛鉤 usePostUserService,它使用 useFetch 掛鉤發(fā)送 POST 請求。它將用戶數(shù)據(jù)作為輸入并將其發(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 將在本文稍后討論“錯誤處理”時進行研究。

讀操作

用例:獲取并顯示資源列表或單個資源(例如,獲取用戶配置文件和產(chǎn)品列表)。
實現(xiàn):發(fā)送 GET 請求來獲取數(shù)據(jù),處理加載和錯誤狀態(tài),并在 UI 中呈現(xiàn)數(shù)據(jù)。

在我們的示例中,讀取數(shù)據(jù)涉及向 API 發(fā)出 GET 請求以獲取用戶數(shù)據(jù)。它可以包括使用分頁、過濾器獲取所有用戶,以及在定義請求 (UsersRequest) 和響應類型 (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)有資源(例如,更新用戶信息、編輯博客文章)。
實現(xiàn):收集更新的數(shù)據(jù),向服務器發(fā)送 PUT 或 PATCH 請求,處理響應,并更新 UI。

讓我們更新現(xiàn)有用戶,這涉及到使用更新的用戶數(shù)據(jù)向 API 發(fā)送 PATCH 請求。為此,在自定義 usePatchUserService 掛鉤中,我們在定義請求 UserPatchRequest 和響應類型 UserPatchResponse 后發(fā)送帶有用戶 ID 和更新數(shù)據(jù)的 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]
  );
}

注意:對于部分數(shù)據(jù)更新,使用 PATCH 代替 PUT 更為高級,而 PUT 通常用于完整資源更新。

刪除操作

用例:刪除資源(例如,刪除用戶或從列表中刪除項目)。
實現(xiàn): 向服務器發(fā)送 DELETE 請求,處理響應,并更新 UI 以反映刪除。

在我們的下一個示例中,刪除用戶涉及使用用戶 ID 向您的 API 發(fā)送 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]
  );
}

這些鉤子抽象了發(fā)出 HTTP 請求和處理響應的復雜性,使用這種方法可確保干凈且可維護的代碼庫,因為數(shù)據(jù)獲取邏輯被封裝并可在組件之間重用。

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

好了,我們已經(jīng)介紹了處理CRUD操作的例子,下面我們來仔細看看Next.js提供的獲取數(shù)據(jù)的方法,因為它作為一個框架,在React的基礎上增加了它的功能和優(yōu)化。很明顯,Next.js 除了 CSR(客戶端渲染)之外,還提供了高級功能,如 SSR(服務器端渲染)、SSG(靜態(tài)站點生成)、內(nèi)置 API 路由和混合渲染。那么,讓我們討論一下 Next.js 和 React 中檢索數(shù)據(jù)的共性和差異。

只要 React 應用程序是純粹的客戶端,那么數(shù)據(jù)獲取就會在初始頁面加載后發(fā)生在客戶端上。對于每次加載頁面時都需要獲取數(shù)據(jù)的動態(tài)頁面,

更適合使用SSR,在這種情況下,數(shù)據(jù)是在請求時在服務器上獲取的。 對于 SSG,它適用于數(shù)據(jù)不經(jīng)常更改的靜態(tài)頁面,數(shù)據(jù)是在構(gòu)建時獲取的。因此,getStaticProps 方法可以幫助我們
在構(gòu)建時獲取數(shù)據(jù) (SSG)。如果我們需要基于動態(tài)路由和構(gòu)建時獲取的數(shù)據(jù)來預渲染頁面,則 getStaticPaths 方法允許執(zhí)行此操作。它與 getStaticProps 結(jié)合使用在構(gòu)建時生成動態(tài)路由。需要注意的是,從 Next 14 開始,我們可以直接在組件中發(fā)出請求,而無需這些方法,從而提供了更多“React 體驗”。

使用 useQuery 進行客戶端數(shù)據(jù)獲取可用于需要在客戶端獲取數(shù)據(jù)的交互式組件,其初始狀態(tài)是從服務器端獲取的數(shù)據(jù)中獲取的。對于獲取頻繁更改的數(shù)據(jù)或添加客戶端交互性,useSWR 策略非常有用。它是一個用于客戶端數(shù)據(jù)獲取、緩存和重新驗證的 React 鉤子。它允許在客戶端獲取數(shù)據(jù),通常是在初始頁面加載之后。盡管如此,它不會在構(gòu)建時或在 SSR 服務器上獲取數(shù)據(jù),但它可以在需要時重新驗證并獲取新數(shù)據(jù)。

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

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 應用程序中數(shù)據(jù)的絕佳工具。使用它的主要好處是:

  • 高效的數(shù)據(jù)獲?。?/strong>它處理緩存和后臺數(shù)據(jù)同步,減少冗余的網(wǎng)絡請求。
  • 自動重新獲?。?/strong>數(shù)據(jù)過時時可以在后臺自動重新獲取,確保UI始終顯示最新信息。
  • 集成錯誤處理:內(nèi)置對處理錯誤和重試的支持,使管理網(wǎng)絡故障和服務器錯誤變得更加容易。
  • 樂觀更新: useMutation 鉤子通過提供一種簡單的方法來處理樂觀 UI 更改和服務器請求失敗時的回滾邏輯,從而提供樂觀更新。
  • 易于與 Next.js 集成:它可以與 getStaticProps 或 getServerSideProps(如果需要)等其他 Next.js 數(shù)據(jù)獲取方法無縫集成。
  • 檢查查詢和突變:ReactQueryDevtools 工具提供了查看所有活動查詢和突變的狀態(tài)、數(shù)據(jù)、錯誤和其他詳細信息的可能性,并在應用程序運行時實時觀察查詢狀態(tài)更新.

查詢客戶端提供者

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

那么,為什么要把它添加到項目中呢?它有益于:

  • 所有查詢和突變的集中配置。
  • 易于設置并集成到現(xiàn)有的 React 應用程序中。
  • 啟用緩存、后臺重新獲取和查詢失效等功能。

React 查詢開發(fā)工具

React Query 提供的另一個重要功能是 React Query Devtools - 一個用于檢查和調(diào)試 React Query 狀態(tài)的開發(fā)工具。它可以輕松添加到您的應用程序中,并通過瀏覽器擴展或作為組件進行訪問,如前面的示例所示。
在開發(fā)過程中,React Query Devtools 可用于檢查單個查詢和突變,了解為什么某些查詢會預取并監(jiān)視查詢緩存的狀態(tài),并查看它如何隨著時間的推移而演變。

分頁和無限滾動

要使用庫中的功能實現(xiàn)分頁控件或無限滾動,useInfiniteQuery 是完美的選擇。首先,我們生成唯一的鍵,用于在 React Query 中緩存和檢索查詢。這里的 by 方法根據(jù)排序和過濾選項創(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ù)當前頁面、過濾器和排序參數(shù)檢索用戶數(shù)據(jù),而 getNextPageParam 函數(shù)根據(jù)上一頁的響應確定要獲取的下一頁。當用戶滾動或請求更多數(shù)據(jù)時,useInfiniteQuery 會根據(jù) nextPage 參數(shù)自動檢索下一組數(shù)據(jù) - 這就是無限滾動發(fā)生的方式。查詢的緩存時間由 gcTime 參數(shù)設置。

總的來說,React Query 提供了一個用于管理和調(diào)試 React 應用程序中服務器狀態(tài)的全面解決方案。 QueryClientProvider 確保所有查詢和突變的集中且一致的配置,而 ReactQueryDevtools 提供強大的工具用于在開發(fā)過程中檢查和理解查詢行為。

錯誤處理

實現(xiàn) CRUD 操作始終需要適當?shù)腻e誤處理,以確保用戶友好性和應用程序可靠性。服務器錯誤通常與客戶端請求處理失敗、服務器代碼錯誤、資源過載、基礎設施配置錯誤或外部服務故障相關。對于錯誤處理,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ù)據(jù)檢索技術。我們深入研究了使用 React Query 來管理狀態(tài),還概述了 QueryClientProvider 和 ReactQueryDevtools 用于調(diào)試和優(yōu)化數(shù)據(jù)檢索的功能。此外,我們還討論了如何實現(xiàn)分頁和無限滾動來處理大型數(shù)據(jù)集,并解決了錯誤處理問題,使您的應用程序更具彈性并確保流暢的用戶體驗。

通過遵循本文中概述的示例和技術,您現(xiàn)在應該能夠在 NextJS 項目中處理 CRUD 操作?;蛘?,您可以為您的項目使用我們的 Extective-react-boilerplate 模板。它具有完全兼容的 Nestjs-boilerplate 后端,可以在幾分鐘內(nèi)實現(xiàn)使用 CRUD 操作的能力,而無需使用 CLI 編寫一行代碼,我們已在此處和此處針對實體關系更詳細地介紹了這一點。不斷嘗試,隨時了解最佳實踐,如果您發(fā)現(xiàn)它有用,歡迎嘗試此樣板。

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

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

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

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集成開發(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是不同的編程語言,各自適用于不同的應用場景。Java用于大型企業(yè)和移動應用開發(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中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

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

為什么要將標簽放在的底部? 為什么要將標簽放在的底部? 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)

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

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

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

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

Java和JavaScript有什么區(qū)別? Java和JavaScript有什么區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應用和大型系統(tǒng)。2.JavaScript是動態(tài)類型、解釋型語言,主要用于網(wǎng)頁交互和前端開發(fā)。

See all articles