日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-08-20 23:17:01 659觀看
導讀數據獲取是任何 react 應用程序的核心方面。對于 React 開發人員來說,了解不同的數據獲取方法以及哪些用例最適合他們很重要。但首先,讓我們了解 JavaScript Promises。簡而言之,promise 是一個 JavaScript 對象,它將在未

數據獲取是任何 react 應用程序的核心方面。對于 React 開發人員來說,了解不同的數據獲取方法以及哪些用例最適合他們很重要。1fa28資訊網——每日最新資訊28at.com

1fa28資訊網——每日最新資訊28at.com

但首先,讓我們了解 JavaScript Promises。1fa28資訊網——每日最新資訊28at.com

簡而言之,promise 是一個 JavaScript 對象,它將在未來的某個時間產生一個值。這通常適用于異步操作(例如數據獲取)。1fa28資訊網——每日最新資訊28at.com

Promises具有三種狀態:1fa28資訊網——每日最新資訊28at.com

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

如果一個promise被Fulfilled或Rejected,它就被解決了。Promise 有不同的方法來根據結果做不同的事情。下一節將更詳細地討論這些方法。1fa28資訊網——每日最新資訊28at.com

1、使用 Promise 方法獲取 api

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

fetch() 方法接受一個參數,即要請求的 URL,并返回一個promise。第二個可選參數options 是一個屬性數組。fetch() 的返回值可以是 JSON 或 XML(對象數組或單個對象)。如果沒有選項參數,fetch() 將始終發出 GET 請求。1fa28資訊網——每日最新資訊28at.com

第一種方法是您通常會在簡單的數據獲取用例中看到的方法,并且通常是瀏覽 API 文檔時的第一個結果。1fa28資訊網——每日最新資訊28at.com

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

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

在上例中,我們調用該方法并傳入 API 端點的 URL。在這個方法中,我們使用 promise 對象的方法(回想一下返回一個 promise)。1fa28資訊網——每日最新資訊28at.com

我們使用這個方法并傳入一個回調函數來檢查響應是否正常。如果響應正常,我們將獲取返回的 JSON 數據并使用該方法將其解析為 JavaScript 對象。如果響應不正常,我們就會報錯。1fa28資訊網——每日最新資訊28at.com

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

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

這種 .finally() 方法使我們能夠避免在 .then() 和 .catch() 中重復代碼,使其成為我們示例中刪除加載狀態的好地方。1fa28資訊網——每日最新資訊28at.com

2、帶有 Promise 方法的庫 Axios

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

第二個示例將非常接近第一個示例的代碼,使用相同的 promise 方法來處理 promise 狀態和響應。1fa28資訊網——每日最新資訊28at.com

在 fetch() 將 Axios 庫導入我們的組件之后,我們可以使用 axios.get() 一種可以將 URL 傳遞到我們的外部 API 端點的方法。1fa28資訊網——每日最新資訊28at.com

這將返回一個 Promise,因此我們可以采用與 Promise 方法鏈接相同的方法。1fa28資訊網——每日最新資訊28at.com

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 state        setError(err);      })      //  regardless if promise resolves successfully or not we remove loading state      .finally(() => {        setLoading ( false );      });  }, []);

Fetch API 的代碼與此 Axios 方法之間的明顯區別在于,使用 Axios 我們只需要一個,因為 Axios 為我們將 .then()JSON 轉換為 JavaScript 對象(縮短了我們的代碼)。1fa28資訊網——每日最新資訊28at.com

另外,我們不再寫條件來手動拋出錯誤,因為axios會為你拋出400和500范圍的錯誤(再次縮短我們的代碼)。1fa28資訊網——每日最新資訊28at.com

3 、異步函數(async/await)

在此示例中,我們將放棄在前兩個示例中使用的承諾鏈,而是引入一種更現代的方法來編寫異步的、基于承諾的代碼。1fa28資訊網——每日最新資訊28at.com

這種方法可以與您選擇的任何抓取機制一起使用,但對于本示例,我們將堅持使用 Axios 庫。1fa28資訊網——每日最新資訊28at.com

第三個示例與前一個示例類似的方式設置組件,方法是導入 Axios 庫,然后使用一個空的 dependencies 數組包裝用于在 useEffecta 中獲取數據的代碼。1fa28資訊網——每日最新資訊28at.com

在 useEffect 中,我們使用關鍵字 async 創建一個異步函數,然后在該函數中我們有三個獨立的部分 - try、catch 和 finally。1fa28資訊網——每日最新資訊28at.com

這種 try/catch 方法用于處理 JavaScript 中的錯誤。try塊內的代碼首先被執行,如果拋出任何錯誤,它們將被“捕獲”在塊中,catch并執行內部代碼。1fa28資訊網——每日最新資訊28at.com

最后,finallyblock 將始終在流通過 try/catch 之后執行。1fa28資訊網——每日最新資訊28at.com

useEffect(() => {    // create async function b/c cannot use async in useEffect arg cb    const fetchData = async () => {    //   with async/await use the try catch block syntax for handling      try {        // 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 state        setError(err);      } finally {        setLoading ( false );      }    };    fetchData ();  }, []);

在此示例中,try 塊創建了一個名為 res(response 的縮寫)的變量,該變量使用 async 關鍵字。這允許代碼看起來同步(更短,更容易在眼睛上)。1fa28資訊網——每日最新資訊28at.com

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

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

第四種方法是創建我們自己的自定義 React 鉤子,調用 useFetchit 可以在我們應用程序的不同組件中重復使用,并從每個組件中刪除笨重的獲取代碼。1fa28資訊網——每日最新資訊28at.com

這個例子實際上只是采用第四個例子(使用 Axios 庫和 async/await 的相同技術)并將該代碼移動到它自己的自定義鉤子中。1fa28資訊網——每日最新資訊28at.com

為此,我們創建了一個名為 useFetch.js 的函數。然后我們使用 Effect 將前面示例中的所有代碼以及我們正在跟蹤的不同狀態添加到函數 useFetch 中。1fa28資訊網——每日最新資訊28at.com

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

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 cb    const fetchData = async () => {      //   with async/await use the try catch block syntax for handling      try {        // 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 state        setError(err);      } finally {        setLoading ( false );      }    };    fetchData ();  }, []);  return {    data,    loading,    error,  };};

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

這種方法的最后一點是您還可以安裝外部庫而不是創建您自己的自定義掛鉤。一個流行的庫 react-fetch-hook 與我們剛剛構建的鉤子具有非常相似的功能。1fa28資訊網——每日最新資訊28at.com

5、 React 查詢庫

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

安裝和導入后,React Query 提供了許多自定義掛鉤,可以以非常干凈的方式在我們的組件中重復使用。1fa28資訊網——每日最新資訊28at.com

在此示例中,我們從中導入 QueryClient,然后使用提供程序包裝我們的應用程序,并將 QueryClientProvider 實例作為屬性傳遞給包裝器。1fa28資訊網——每日最新資訊28at.com

這使我們能夠在我們的應用程序中使用該庫。1fa28資訊網——每日最新資訊28at.com

為了發出這個簡單的 GET 請求,我們導入并使用了 useQueryhooks。與前面使用自定義掛鉤的示例不同,我們傳入了兩個參數。1fa28資訊網——每日最新資訊28at.com

第一個必需參數是 queryKey ,用作此特定查詢的參考鍵。1fa28資訊網——每日最新資訊28at.com

第二個必需參數是 queryFn ,它是查詢將用于請求數據的函數。1fa28資訊網——每日最新資訊28at.com

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

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

isLoading 從這里開始,React Query 將在幕后完成所有額外的工作,在這種情況下,我們可以從這個鉤子調用 destructure 、 error 和 use data in our application,盡管我們也可以訪問許多其他值。1fa28資訊網——每日最新資訊28at.com

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

6、 Redux 工具包 RTK 查詢

本文最后一種方法是使用Redux Toolkit的RTK Query進行數據采集。應用程序使用 Redux 進行狀態管理是很常見的。1fa28資訊網——每日最新資訊28at.com

如果您的公司或您當前的副項目目前正在使用 Redux,一個不錯的選擇是使用 RTK 查詢來獲取數據,因為它提供了與 React 查詢類似的簡單性和優勢。1fa28資訊網——每日最新資訊28at.com

要在存儲 Redux 代碼的任何地方開始使用 RTK 查詢,請創建一個 rtkQueryService.js 文件來設置數據獲取。1fa28資訊網——每日最新資訊28at.com

創建后,您將服務添加到您的 Redux 商店,假設您已經在使用 Redux,您將已經擁有一個包含您的應用程序的 <Provider>store 組件。1fa28資訊網——每日最新資訊28at.com

從這里開始,它與使用帶有 React Query 方法的自定義鉤子非常相似,您導入然后使用查詢鉤子并解構數據,錯誤然后是 Loading 可以在您的組件中使用。1fa28資訊網——每日最新資訊28at.com

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

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

最后的想法

如果你已經看到了這里,那么恭喜你!這篇文章的目的就是為那些學習 React 的人介紹一些不同的數據獲取方法。1fa28資訊網——每日最新資訊28at.com

在這篇文章中,我介紹了6種方法,希望這6種方法對你有用,也希望你能從中學習到一些新東西。1fa28資訊網——每日最新資訊28at.com

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

本文鏈接:http://m.www897cc.com/showinfo-26-6173-0.html六種在 React 中獲取數據的方法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 十分鐘,帶你了解 Vue3 的新寫法

下一篇: 面試必問:線程池是如何執行的?它的拒絕策略有哪些?

標簽:
  • 熱門焦點
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結合在一起的產品,通常這樣的詞是貶義詞,但如果真的是產品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 女孩租房開2小時空調用完100元電費引熱議:5級能耗惹不起 月薪過萬電費也交不起

    近日,江蘇蘇州一女孩租房當天充值了100元電費,開著空調不到2小時發現電費已用完。對于為什么這個快,房東表示,電表壞了這種情況很多,之前也遇到過,給租客換
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 蘋果公司要求三星和LG Display生產「無邊框」OLED iPhone顯示屏

    據 The Elec 報道,蘋果已要求其供應商為未來的 iPhone 型號開發「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發新的 OLED 顯示面
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
在线观看日韩www视频免费| 国产精品久久久久秋霞鲁丝| 国产精品美女www爽爽爽| 先锋影音一区二区三区| 在线免费观看视频一区| 国产欧美日韩另类一区| 欧美精品一区二区三区在线看午夜| 亚洲精品国产精品国产自| 欧美日韩午夜激情| 欧美成人a视频| 欧美一区二区免费| 一片黄亚洲嫩模| 亚洲黄色在线看| 国产日韩精品一区二区| 国产精品v欧美精品v日韩| 欧美高清在线播放| 久久精品国产久精国产爱 | 亚洲成色www久久网站| 国产精品女人久久久久久| 久久一区中文字幕| 久久久夜夜夜| 午夜精品久久| 性欧美在线看片a免费观看| 日韩一级黄色av| 亚洲黄色高清| 亚洲成人在线视频网站| 狠狠色丁香婷婷综合久久片| 国产精品一区久久| 国产精品高潮呻吟久久| 欧美日韩一区二区在线观看| 欧美激情成人在线视频| 久久久久久亚洲精品中文字幕| 这里只有精品在线播放| 在线一区观看| 一本色道久久88综合亚洲精品ⅰ | 欧美激情按摩在线| 欧美成人小视频| 欧美成黄导航| 欧美视频手机在线| 国产精品vvv| 国产欧美日本在线| 韩日精品在线| 亚洲激情欧美激情| 亚洲五月六月| 久久久久一本一区二区青青蜜月| 两个人的视频www国产精品| 欧美日本一区| 国产精品一区在线观看你懂的| 欧美日韩一区国产| 欧美不卡高清| 欧美无砖砖区免费| 国产精品永久免费在线| 黄色一区二区在线| 中文精品视频一区二区在线观看| 亚洲激情亚洲| 亚洲午夜一二三区视频| 久久久久成人网| 欧美色大人视频| 亚洲高清一区二区三区| 亚洲一区中文| 欧美福利专区| 韩国一区二区三区美女美女秀| 亚洲区第一页| 久久亚洲国产成人| 国产婷婷精品| 亚洲欧美激情四射在线日 | 久久亚洲综合网| 欧美精品一区二区三区一线天视频| 欧美午夜精品久久久久久人妖| 红桃av永久久久| 性刺激综合网| 国产精品一区二区久久国产| 99在线精品视频| 久久伊人亚洲| 国产人成一区二区三区影院| 亚洲美女淫视频| 欧美成人中文字幕在线| 国外精品视频| 久久gogo国模裸体人体| 欧美日韩不卡一区| 亚洲激情视频在线| 美日韩精品免费| 在线播放中文一区| 欧美专区在线观看一区| 国产精品推荐精品| 在线亚洲+欧美+日本专区| 欧美成人午夜激情| 激情久久综艺| 久久综合色综合88| 亚洲激情av| 欧美a级片网站| 艳妇臀荡乳欲伦亚洲一区| 久久久久久香蕉网| 亚洲国产成人一区| 老司机精品视频一区二区三区| 亚洲国产欧美日韩精品| 国产精品久久久久久久久久三级 | 一本色道久久综合一区| 欧美区一区二区三区| 亚洲综合不卡| 伊人精品久久久久7777| 暖暖成人免费视频| 亚洲调教视频在线观看| 国产一区91| 欧美精品一区三区| 久久国产精品久久久久久| 国产综合香蕉五月婷在线| 欧美另类女人| 欧美伊人久久久久久午夜久久久久 | 亚洲欧美成人一区二区三区| 国产亚洲一本大道中文在线| 欧美激情综合| 久久国内精品视频| 亚洲一区二区三区777| 国产乱码精品一区二区三区忘忧草| 欧美电影免费观看大全| 这里只有精品视频| 亚洲福利视频一区二区| 国产视频在线一区二区| 国产精品v亚洲精品v日韩精品| 欧美一区二区免费视频| 亚洲欧洲综合另类在线| 亚洲国产精品一区二区第四页av| 国产日韩精品一区二区三区| 欧美激情免费在线| 欧美成人精品高清在线播放| 久久精品国产v日韩v亚洲| 亚洲桃花岛网站| 夜夜嗨一区二区| 亚洲经典在线| 在线成人av.com| 影音先锋久久资源网| 狠狠色丁香久久综合频道| 国产亚洲毛片在线| 国产亚洲女人久久久久毛片| 国产精品久久久久久久久婷婷| 欧美人与性动交cc0o| 开心色5月久久精品| 久久视频一区二区| 免费中文日韩| 欧美啪啪一区| 欧美小视频在线| 国产精品白丝av嫩草影院| 国产精品成人一区二区网站软件 | 韩国一区二区三区在线观看 | 午夜影视日本亚洲欧洲精品| 在线视频日本亚洲性| 亚洲一区二区av电影| 亚洲一区二区三区在线观看视频| 一二三区精品福利视频| 亚洲一区二区三区精品视频| 亚洲免费观看| 蜜桃av一区二区| 老色鬼精品视频在线观看播放| 欧美1区3d| 欧美日韩国产一中文字不卡| 欧美三区在线观看| 国产午夜亚洲精品羞羞网站 | 美女视频一区免费观看| 欧美另类变人与禽xxxxx| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 欧美激情按摩在线| 欧美亚洲不卡| 国产网站欧美日韩免费精品在线观看| 国产一区二区三区奇米久涩| 亚洲精品一区二区三区婷婷月| 亚洲永久免费精品| 久久久久久自在自线| 欧美精品免费播放| 国产日产亚洲精品| 日韩网站在线看片你懂的| 欧美一区观看| 欧美三级免费| 在线成人激情黄色| 亚洲欧美在线高清| 欧美激情一区| 国产午夜亚洲精品羞羞网站| 亚洲区一区二区三区| 欧美一区二区私人影院日本 | 免费亚洲电影在线| 国产日韩欧美一二三区| 亚洲精品国产品国语在线app| 欧美一区二区三区视频| 欧美午夜宅男影院在线观看| 在线日韩av| 欧美一区三区三区高中清蜜桃 | 亚洲精品欧美日韩专区| 久久久久久久一区二区三区| 国产精品日韩一区二区三区| 影音先锋成人资源站| 欧美在线观看网址综合| 国产精品久久夜| 亚洲男女自偷自拍| 欧美日韩二区三区| 日韩视频精品| 久久免费视频在线| 国产日韩av高清| 久久国产加勒比精品无码| 欧美亚男人的天堂| 国产精品99久久99久久久二8 | 亚洲一区二区黄| 欧美日韩午夜激情| 中文一区在线| 国产欧美日韩精品在线|