在 React 中獲取數據的6種方法

一、前言

數據獲取是任何?react?應用程序的核心方面。對于 React 開發人員來說,了解不同的數據獲取方法以及哪些用例最適合他們很重要。

但首先,讓我們了解 JavaScript Promises。

簡而言之,promise 是一個 JavaScript 對象,它將在未來的某個時間產生一個值。這通常適用于異步操作(例如數據獲取)。

Promises具有三種狀態:

  • Pending:承諾仍在進行中的地方
  • Fulfilled:承諾成功解決并返回值的地方
  • Rejected:承諾因錯誤而失敗

如果一個promise被Fulfilled或Rejected,它就被解決了。Promise 有不同的方法來根據結果做不同的事情。下一節將更詳細地討論這些方法。

二、使用 Promise 方法獲取?api

Fetch API 提供了一個全局的 fetch() 方法,使開發人員能夠以直接的方式獲取數據。在 fetch() 之前,傳統方法是使用 XMLHttpRequest()。(本文不涉及此方法,因為 fetch() 已被更強大、更靈活的功能集所取代。)

fetch() 方法接受一個參數,即要請求的 URL,并返回一個promise。第二個可選參數options 是一個屬性數組。fetch() 的返回值可以是 JSON 或 XML(對象數組或單個對象)。如果沒有選項參數,fetch() 將始終發出 GET 請求。

第一種方法是您通常會在簡單的數據獲取用例中看到的方法,并且通常是瀏覽 API 文檔時的第一個結果。

如前所述,我們從返回狗的隨機圖像的 API 獲取數據,并將該圖像呈現在屏幕上。在發出請求之前,我們將代碼包裝在一個帶有空依賴項數組的 useEffecthook 中,以便 fetch() 方法僅在組件最初安裝時運行。

useEffect(() => {fetch(URL)// syntax for handling promises.then((res) => {// check to see if response is okayif (res.ok) {// if okay, take JSON and parse to JavaScript objectreturn res.json();}throw res;})//  .json() returns a promise as well.then((data) => {console.log(data);// setting response as the data statesetData(data);})// if res is not okay the res is thrown here for error.catch((err) => {console.error(`Error: ${err}`);// setting the error statesetError(err);})//  regardless if promise resolves successfully or not we remove loading state.finally(() => {setLoading ( false );});}, []);

在上例中,我們調用該方法并傳入 API 端點的 URL。在這個方法中,我們使用 promise 對象的方法(回想一下返回一個 promise)。

我們使用這個方法并傳入一個回調函數來檢查響應是否正常。如果響應正常,我們將獲取返回的 JSON 數據并使用該方法將其解析為 JavaScript 對象。如果響應不正常,我們就會報錯。

由于 .json() 方法也返回一個承諾,我們可以鏈接另一個 .then() 并傳遞一個函數來設置數據的狀態,然后在組件的其他地方使用。在我們的示例中,外部 API 返回一個具有 url 屬性的對象(它將用作 srcour 圖像)。

繼續通過鏈,下一部分是 .catch() 以安排在承諾被拒絕時調用的函數。這也返回另一個承諾,然后我們可以鏈接 .finally() 無論承諾是否已解決(解決或拒絕),它都會被調用。

這種 .finally() 方法使我們能夠避免在 .then() 和 .catch() 中重復代碼,使其成為我們示例中刪除加載狀態的好地方。

三、帶有 Promise 方法的庫 Axios

Axios 是一個流行的 HTTP 客戶端庫,用于高效的數據獲取。它可以通過?npm?或其他包管理器輕松安裝到 React 應用程序中。使用 Axios 是 Fetch API 的替代方法,如果您不介意安裝外部庫,它有一些優勢。

第二個示例將非常接近第一個示例的代碼,使用相同的 promise 方法來處理 promise 狀態和響應。

在 fetch() 將 Axios 庫導入我們的組件之后,我們可以使用 axios.get() 一種可以將 URL 傳遞到我們的外部 API 端點的方法。

這將返回一個 Promise,因此我們可以采用與 Promise 方法鏈接相同的方法。

useEffect(() => {axios.get(URL)// syntax for handling promises.then((res) => {console.log(res.data);// axios converts json to object for us (shortens our code)setData(res.data);})// axios takes care of error handling for us instead of checking manually.catch((err) => {console.error(`Error: ${err}`);// setting the error statesetError(err);})//  regardless if promise resolves successfully or not we remove loading state.finally(() => {setLoading ( false );});}, []);

Fetch API 的代碼與此 Axios 方法之間的明顯區別在于,使用 Axios 我們只需要一個,因為 Axios 為我們將 .then()JSON 轉換為 JavaScript 對象(縮短了我們的代碼)。

另外,我們不再寫條件來手動拋出錯誤,因為axios會為你拋出400和500范圍的錯誤(再次縮短我們的代碼)。

四、異步函數(async/await)

在此示例中,我們將放棄在前兩個示例中使用的承諾鏈,而是引入一種更現代的方法來編寫異步的、基于承諾的代碼。

這種方法可以與您選擇的任何抓取機制一起使用,但對于本示例,我們將堅持使用 Axios 庫。

第三個示例與前一個示例類似的方式設置組件,方法是導入 Axios 庫,然后使用一個空的 dependencies 數組包裝用于在 useEffecta 中獲取數據的代碼。

在 useEffect 中,我們使用關鍵字 async 創建一個異步函數,然后在該函數中我們有三個獨立的部分 - try、catch 和 finally。

這種 try/catch 方法用于處理 JavaScript 中的錯誤。try塊內的代碼首先被執行,如果拋出任何錯誤,它們將被“捕獲”在塊中,catch并執行內部代碼。

最后,finallyblock 將始終在流通過 try/catch 之后執行。

useEffect(() => {// create async function b/c cannot use async in useEffect arg cbconst fetchData = async () => {//   with async/await use the try catch block syntax for handlingtry {// using await to make async code look sync and shorten const res = await axios.get(URL);setData(res.data);} catch (err) {console.error(`Error: ${err}`);// setting the error statesetError(err);} finally {setLoading ( false );}};fetchData ();}, []);

在此示例中,try 塊創建了一個名為 res(response 的縮寫)的變量,該變量使用 async 關鍵字。這允許代碼看起來同步(更短,更容易在眼睛上)。

在此示例中,axios.get(URL) 正在“等待”直到它穩定下來。如果承諾得到履行,那么我們將數據設置為狀態。如果承諾被拒絕(拋出錯誤),它會進入 catch 塊。

五、創建一個“useFetch”自定義 React Hook

第四種方法是創建我們自己的自定義 React 鉤子,調用 useFetchit 可以在我們應用程序的不同組件中重復使用,并從每個組件中刪除笨重的獲取代碼。

這個例子實際上只是采用第四個例子(使用 Axios 庫和 async/await 的相同技術)并將該代碼移動到它自己的自定義鉤子中。

為此,我們創建了一個名為 useFetch.js 的函數。然后我們使用 Effect 將前面示例中的所有代碼以及我們正在跟蹤的不同狀態添加到函數 useFetch 中。

最后,這個函數將返回一個包含每個狀態的對象,然后在調用鉤子的地方使用 useFetchaccessed。我們的 useFetchhook 還將接受一個參數,即 URL ,以允許更多的可重用性和向不同端點發出提取請求的可能性。

const useFetch = (url) => {const [data, setData] = useState(null);const [ loading , setLoading ] =  useState ( true );const [error, setError] = useState(null);useEffect(() => {// create async function b/c cannot use asyc in useEffect arg cbconst fetchData = async () => {//   with async/await use the try catch block syntax for handlingtry {// using await to make async code look sync and shortenconst res = await axios.get(url);setData(res.data);} catch (err) {console.error(`Error: ${err}`);// setting the error statesetError(err);} finally {setLoading ( false );}};fetchData ();}, []);return {data,loading,error,};
};

最后,我們將這個新的自定義鉤子導入到將使用它的組件中,并像調用任何其他 React 鉤子一樣調用它。如您所見,這極大地提高了代碼的可讀性并縮短了我們的組件。

這種方法的最后一點是您還可以安裝外部庫而不是創建您自己的自定義掛鉤。一個流行的庫 react-fetch-hook 與我們剛剛構建的鉤子具有非常相似的功能。

六、React 查詢庫

在 React 中獲取數據的最現代和最強大的方法之一是使用 React Query 庫。除了簡單的數據獲取之外,它還有許多功能,但是對于這個例子,我們將學習如何從同一個示例外部 API 中簡單地獲取數據。

安裝和導入后,React Query 提供了許多自定義掛鉤,可以以非常干凈的方式在我們的組件中重復使用。

在此示例中,我們從中導入 QueryClient,然后使用提供程序包裝我們的應用程序,并將 QueryClientProvider 實例作為屬性傳遞給包裝器。

這使我們能夠在我們的應用程序中使用該庫。

為了發出這個簡單的 GET 請求,我們導入并使用了 useQueryhooks。與前面使用自定義掛鉤的示例不同,我們傳入了兩個參數。

第一個必需參數是 queryKey ,用作此特定查詢的參考鍵。

第二個必需參數是 queryFn ,它是查詢將用于請求數據的函數。

我們將使用此查詢函數,然后使用 Fetch API 和 promise 方法語法進行初始提取,而不是像我們之前的自定義掛鉤示例中那樣只傳遞一個簡單的 URL。(這個鉤子有許多其他可選參數。)

const { isLoading, error, data } = useQuery("dogData", () => fetch(URL).then((res) => res.json()));

isLoading 從這里開始,React Query 將在幕后完成所有額外的工作,在這種情況下,我們可以從這個鉤子調用 destructure 、 error 和 use data in our application,盡管我們也可以訪問許多其他值。

在比我們當前的 Dog Image API 示例更大的示例中,使用 React Query 的力量和優勢是顯而易見的。需要提及的一些附加功能包括:緩存、在后臺更新“陳舊”數據以及其他與性能相關的優勢。

七、Redux?工具包 RTK 查詢

本文最后一種方法是使用Redux Toolkit的RTK Query進行數據采集。應用程序使用 Redux 進行狀態管理是很常見的。

如果您的公司或您當前的副項目目前正在使用 Redux,一個不錯的選擇是使用 RTK 查詢來獲取數據,因為它提供了與 React 查詢類似的簡單性和優勢。

要在存儲 Redux 代碼的任何地方開始使用 RTK 查詢,請創建一個 rtkQueryService.js 文件來設置數據獲取。

創建后,您將服務添加到您的 Redux 商店,假設您已經在使用 Redux,您將已經擁有一個包含您的應用程序的 <Provider>store 組件。

從這里開始,它與使用帶有 React Query 方法的自定義鉤子非常相似,您導入然后使用查詢鉤子并解構數據,錯誤然后是 Loading 可以在您的組件中使用。

const { data, error, isLoading } = useGetDogQuery();

如您所見,Redux 有很多設置,因此這可能不是我們用例的最佳方法,但如果您已經在 React 應用程序中使用 Redux 并且想要一種簡單而現代的獲取數據的方式,RTK 查詢 可能很棒很有價值,這也提供了緩存等好處。

最后的想法

如果你已經看到了這里,那么恭喜你!這篇文章的目的就是為那些學習 React 的人介紹一些不同的數據獲取方法。

在這篇文章中,我介紹了6種方法,希望這6種方法對你有用,也希望你能從中學習到一些新東西。

此外,還有其他當前的數據獲取方法未在此文章中提及,我相信隨著 React 生態系統的發展,其他方法將會出現。也就是說,我相信本文為理解該領域提供了堅實的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python Web:Django、Flask和FastAPI框架對比

原文&#xff1a;百度安全驗證 Django、Flask和FastAPI是Python Web框架中的三個主要代表。這些框架都有著各自的優點和缺點&#xff0c;適合不同類型和規模的應用程序。 1. Django&#xff1a; Django是一個全功能的Web框架&#xff0c;它提供了很多內置的應用程序和工具&am…

排序+運算>直接運算的效率的原因分析

大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

ADIS16470和ADIS16500從到手到讀出完整數據,附例程

由于保密原因&#xff0c;不能上傳我這邊的代碼&#xff0c;我所用的開發環境是IAR&#xff0c; 下邊轉載別的博主的文章&#xff0c;他用的是MDK 下文的博主給了你一個很好的思路&#xff0c;特此提出表揚 最下方是我做的一些手冊批注&#xff0c;方便大家了解這個東西 原文鏈…

如何利用 ChatGPT 進行自動數據清理和預處理

推薦&#xff1a;使用 NSDT場景編輯器助你快速搭建可二次編輯的3D應用場景 ChatGPT 已經成為一把可用于多種應用的瑞士軍刀&#xff0c;并且有大量的空間將 ChatGPT 集成到數據科學工作流程中。 如果您曾經在真實數據集上訓練過機器學習模型&#xff0c;您就會知道數據清理和預…

有沒有比讀寫鎖更快的鎖

在之前的文章中&#xff0c;我們介紹了讀寫鎖&#xff0c;學習完之后你應該已經知道了讀寫鎖允許多個線程同時訪問共享變量&#xff0c;適用于讀多寫少的場景。那么在讀多寫少的場景中還有沒有更快的技術方案呢&#xff1f;還真有&#xff0c;在Java1.8這個版本里提供了一種叫S…

Docker安裝Skywalking APM分布式追蹤系統

Skywalking是一個應用性能管理(APM)系統&#xff0c;具有服務器性能監測&#xff0c;應用程序間調用關系及性能監測等功能&#xff0c;Skywalking分為服務端、管理界面、以及嵌入到程序中的探針部分&#xff0c;由程序中的探針采集各類調用數據發送給服務端保存&#xff0c;在管…

novnc 和 vnc server 如何實現通信?原理?

參考&#xff1a;https://www.codenong.com/js0f3b351a156c/

隨機微分方程

應用隨機過程|第7章 隨機微分方程 見知乎&#xff1a;https://zhuanlan.zhihu.com/p/348366892?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384

復習3-5天【80天學習完《深入理解計算機系統》】第七天

專注 效率 記憶 預習 筆記 復習 做題 歡迎觀看我的博客&#xff0c;如有問題交流&#xff0c;歡迎評論區留言&#xff0c;一定盡快回復&#xff01;&#xff08;大家可以去看我的專欄&#xff0c;是所有文章的目錄&#xff09;   文章字體風格&#xff1a; 紅色文字表示&#…

Linux與bash(基礎內容一)

一、常見的linux命令&#xff1a; 1、文件&#xff1a; &#xff08;1&#xff09;常見的文件命令&#xff1a; &#xff08;2&#xff09;文件屬性&#xff1a; &#xff08;3&#xff09;修改文件屬性&#xff1a; 查看文件的屬性&#xff1a; ls -l 查看文件的屬性 ls …

神經網絡基礎-神經網絡補充概念-33-偏差與方差

概念 偏差&#xff08;Bias&#xff09;&#xff1a; 偏差是模型預測值與實際值之間的差距&#xff0c;它反映了模型對訓練數據的擬合能力。高偏差意味著模型無法很好地擬合訓練數據&#xff0c;通常會導致欠擬合。欠擬合是指模型過于簡單&#xff0c;不能捕捉數據中的復雜模式…

基于java在線讀書與分享論壇設計與實現

摘 要 互聯系統的技術在如今的社會中&#xff0c;應用的越來越廣泛&#xff0c;通過互聯系統我們可以更方便地進行辦公&#xff0c;也能夠在系統上就能處理很多日常的事務。互聯系統的技術的發展&#xff0c;也是人們日常中接觸更多的一項技術。隨著互聯系統的發展&#xff0c;…

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 摘要當前的檢測sota模型網絡架構swin Transformer和Vision Transformer的不同之處整體架構Patch Partition結構Linear Embedding結構Swin Transformer Block結構 Patch MergingW-MSAMSA模塊計算量W-M…

學習Vue:Vue3 VS Vue2

Vue 3作為Vue.js的最新版本&#xff0c;帶來了一系列令人激動的新特性和改進&#xff0c;讓開發者們在構建現代Web應用時體驗更加順暢和高效。本文將全面介紹Vue 3相對于Vue 2的改進&#xff0c;重點解釋Composition API的使用&#xff0c;以及新引入的Teleport和Suspense等特性…

Genoss GPT簡介:使用 Genoss 模型網關實現多個LLM模型的快速切換與集成

一、前言 生成式人工智能領域的發展繼續加速&#xff0c;大型語言模型 (LLM) 的用途范圍不斷擴大。這些用途跨越不同的領域&#xff0c;包括個人助理、文檔檢索以及圖像和文本生成。ChatGPT 等突破性應用程序為公司進入該領域并開始使用這項技術進行構建鋪平了道路。 大公司正…

如何發布自己的小程序

小程序的基礎內容組件 text&#xff1a; 文本支持長按選中的效果 <text selectable>151535313511</text> rich-text: 把HTML字符串渲染為對應的UI <rich-text nodes"<h1 stylecolor:red;>123</h1>"></rich-text> 小程序的…

MySql過濾重復數據

假設模型表是: 1. 根據單字段過濾: SELECT user_name, COUNT(*) as count FROM sys_user GROUP BY user_name HAVING count > 1;結果: 2. 根據多個字段查詢重復數據 SELECT user_name, email, COUNT(*) as count FROM sys_user GROUP BY user_name, email HAVING count…

[centos]設置主機名

1、設置 hostnamectl set-hostname 名字 2、查看是否生效 hostnamectl status 3、打開一個新鏈接就可以了

log4j教程_編程入門自學教程_菜鳥教程-免費教程分享

教程簡介 Log4j是Apache的一個開源項目&#xff0c;通過使用Log4j&#xff0c;我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件&#xff0c;甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等&#xff1b;我們也可以控制每一條日志的輸出格式&#xff1b;…

[python] 使用Jieba工具中文分詞及文本聚類概念

前面講述了很多關于Python爬取本體Ontology、消息盒InfoBox、虎撲圖片等例子&#xff0c;同時講述了VSM向量空間模型的應用。但是由于InfoBox沒有前后文和語義概念&#xff0c;所以效果不是很好&#xff0c;這篇文章主要是爬取百度5A景區摘要信息&#xff0c;再利用Jieba分詞工…