使用 NextJS 掌握 CRUD
在 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 體驗」。
為了總結有關上述方法的信息,我們可以看一下表格,該表格全面概述了 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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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