国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

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

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

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

Promises具有三種狀態:

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

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

01、使用 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 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)。

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

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

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

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

02、帶有 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 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 對象(縮短了我們的代碼)。

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

03 、異步函數(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 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 關鍵字。這允許代碼看起來同步(更短,更容易在眼睛上)。

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

04、 創建一個“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 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 鉤子一樣調用它。如您所見,這極大地提高了代碼的可讀性并縮短了我們的組件。

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

05、 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 的力量和優勢是顯而易見的。需要提及的一些附加功能包括:緩存、在后臺更新“陳舊”數據以及其他與性能相關的優勢。

06、 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 生態系統的發展,其他方法將會出現。也就是說,我相信本文為理解該領域提供了堅實的基礎。

最后,感謝你的閱讀。

責任編輯:華軒 來源: web前端開發
相關推薦

2023-08-15 15:44:55

React開發

2023-04-26 08:41:16

Git撤消更改

2016-05-10 14:38:13

大數據企業

2023-09-06 08:00:00

ChatGPT數據分析

2011-02-24 10:56:34

人才

2022-05-25 09:55:40

數據重復提交Java

2025-05-19 00:02:00

數據脫敏加密算法數據庫

2020-10-27 10:33:01

物聯網

2016-09-01 14:04:51

數據中心

2023-09-24 14:52:21

數據分析相關系數矩陣

2010-10-08 11:13:22

MySQL修改密碼

2020-12-15 10:54:22

物聯網互聯網IoT

2022-05-30 16:42:20

數據中心

2023-07-29 00:08:32

2012-08-22 10:32:34

2023-12-08 08:53:37

數據中心人工智能自動化

2025-01-02 08:21:32

2010-10-22 16:29:11

SQL Server刪

2011-03-31 14:53:13

數據中心節能

2025-08-07 02:11:00

點贊
收藏

51CTO技術棧公眾號

秋霞无码一区二区| 国产欧美精品一区二区色综合| 欧美精品在线一区二区三区| 欧美网站免费观看| 欧美日韩免费观看一区=区三区| 在线观看不卡av| 91精品专区| 久久欧美一区二区| 精品久久久久久一区二区里番| 日韩区一区二| 精品亚洲一区二区三区在线观看| 最近中文字幕在线| 久久精品视频在线看| 一级日韩一区在线观看| 国产精品mv在线观看| 2024亚洲男人天堂| 中文在线一区| 一区二区三区无码高清视频| 精品久久久久久久久久ntr影视| mm1313亚洲国产精品无码试看| 国产资源在线一区| 日韩免费黄色av| 色偷偷一区二区三区| 亚洲欧美国产精品桃花| 日韩国产一二三区| 99精品久久久久久| 国产精品草莓在线免费观看| 久操国产精品| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 成人情视频高清免费观看电影| 国产日产精品久久久久久婷婷| 日韩中文字幕在线观看| 超级碰碰久久| 亚洲人a成www在线影院| 精品网站在线看| 日韩精品1区2区3区| 一本色道久久综合亚洲精品婷婷| 新狼窝色av性久久久久久| 午夜精品亚洲一区二区三区嫩草| 国产日韩欧美精品一区| 视频二区在线| 日韩美女久久久| 日本国产亚洲| 你真棒插曲来救救我在线观看| 国产精品热久久久久夜色精品三区| 亚洲精品日产aⅴ| 日韩av在线中文字幕| 成人网在线视频| 中文字幕在线观看不卡| 懂色av一区| 日韩av快播网址| 国产精品亚洲综合久久| 性欧美在线看片a免费观看| 免费在线黄色网址| 亚洲伊人伊色伊影伊综合网| dy888午夜| 亚洲一区日本| 久久国产一区| 欧美日韩看看2015永久免费 | 理论在线观看| 国产区亚洲区欧美区| 亚洲在线中文字幕| 亚洲欧美网站| av在线不卡精品| 男人天堂999| 91久久精品国产91久久| 日韩精品综合一本久道在线视频| 久久激情久久| 亚洲自拍电影| 国产成人高清精品| 免费男女羞羞的视频网站中文版| 久久精品在线视频| 九九视频精品免费| 亚洲图片88| 美女精品国产| 欧美午夜精品一区| 欧美精品综合| a免费在线观看| 蜜桃久久影院| 欧美久久一二三四区| 99re国产精品| 美女91在线| 亚洲国产精品无码av| 国产一区二区三区在线观看视频 | 国产视频久久久| av资源在线| 久久综合伊人77777尤物| 亚洲自拍电影| 蜜桃精品久久久久久久免费影院| 波多野结衣中文字幕一区二区三区 | 久久艹中文字幕| 丁香亚洲综合激情啪啪综合| 7878视频在线观看| 在线电影国产精品| 亚洲精品黑牛一区二区三区| 粉嫩av一区二区三区免费观看| 国产精品77777竹菊影视小说| 污视频网站免费看| 亚洲免费福利视频| 99久久99久久精品国产片果冰| 五月天男人天堂| 亚洲综合清纯丝袜自拍| av第一福利在线导航| 国产精品久久久久91| 另类综合日韩欧美亚洲| 国产精品精华液网站| 影音先锋欧美精品| 中文精品电影| 色片在线免费观看| 亚洲精品福利在线观看| 欧美成人自拍| 黄色片久久久久| 精品国产伦理网| 欧美超碰在线| 青青草精品视频在线观看| 日韩一区二区电影在线| 国产亚洲一区二区三区啪 | 国产精选一区| 亚洲色成人www永久在线观看| 欧洲一区在线观看| 久久丝袜视频| 男人添女人荫蒂免费视频| 欧美在线你懂得| 好吊妞国产欧美日韩免费观看网站| 色就是色欧美| 一本色道亚洲精品aⅴ| 国产精品色在线网站| www.69av| 精品噜噜噜噜久久久久久久久试看 | 激情丁香在线| 亚洲欧美在线一区二区| 欧美日韩国产精品一区二区亚洲| 成人午夜剧场免费观看完整版| 亚洲欧美在线第一页| 欧美综合二区| 大片免费播放在线视频| 国产精品一区二区电影| 亚洲精品水蜜桃| 91精品国产乱码久久久竹菊| 97av中文字幕| 国产视频一区在线| 奇米精品一区二区三区四区 | 亚洲一级大片| 国产精品久久久久7777| 精品福利一二区| 先锋影音久久| 色的视频在线免费看| 福利精品视频| 色久综合一二码| 91超碰成人| 三级在线视频| 亚洲一区二区久久久久久久| 尤物av一区二区| 精品香蕉视频| 中文在线视频| 91入口在线观看| 色一情一伦一子一伦一区| 黄色一区二区在线| 欧美色女视频| 四虎在线视频| 91九色视频在线| 天天色天天爱天天射综合| 永久亚洲成a人片777777| 欧美日韩免费做爰大片| 99re在线| 欧美精品一二三| 麻豆91小视频| 天天综合在线观看| mm1313亚洲国产精品无码试看| 97精品国产97久久久久久| 亚洲天堂a在线| 日韩精品首页| 日本中文在线| 永久免费网站视频在线观看| 久久伊人精品视频| 亚洲精选视频在线| 韩国精品一区二区三区| 青春草视频在线| 91精品国产91久久久久麻豆 主演| 免费99精品国产自在在线| 亚洲欧美一区二区三区国产精品| 精品国产精品久久一区免费式| 精品久久久久一区二区三区 | h片在线免费观看| 一区视频二区视频| 久久精品福利视频| 亚洲精品久久久蜜桃| 国产综合色产| 国产777精品精品热热热一区二区| 日韩av中文字幕第一页| 7777免费精品视频| 91福利精品视频| 国内久久精品视频| 精品视频自拍| 国产高清免费在线播放| 99re99热| 51午夜精品视频| 欧美一级精品在线| 亚洲国产精品t66y| 国产91对白在线播放|