精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React 中請求遠程數據的四種方法

開發 前端
React 是一個專注的組件庫。因此,它對如何請求遠程數據沒有什么建議。如果要通過 HTTP 請求數據并將其發送到 Web API,可以考慮下面四種方法。

 [[334859]]

React 是一個專注的組件庫。因此,它對如何請求遠程數據沒有什么建議。如果要通過 HTTP 請求數據并將其發送到 Web API,可以考慮下面四種方法。

  • 內聯寫法
  • 集中管理
  • 自定義 Hook
  • react-query/swr

注意:在本文中,我將使用 fetch 進行 HTTP 調用,但是這些模式也適用于 Axios 之類的替代方法。另外,如果你使用的是 GraphQ L,還可以考慮使用 Apollo 之類的其他不錯的選擇。這篇文章假設你正在調用傳統的 REST API。

方式1:內聯

這是最簡單,最直接的選擇。在 React 組件中進行 HTTP 調用并處理響應。

 

  1. fetch("/users").then(response => response.json()); 

看起來很簡單。但是這個示例忽略了加載狀態,錯誤處理,聲明和設置相關狀態等。在現實世界中, HTTP 調用看起來更像這樣。

 

  1. import React, { useState, useEffect } from "react"
  2.  
  3. export default function InlineDemo() { 
  4.   const [users, setUsers] = useState([]); 
  5.   const [loading, setLoading] = useState(true); 
  6.   const [error, setError] = useState(null); 
  7.  
  8.   useEffect(() => { 
  9.     fetch(`${process.env.REACT_APP_API_BASE_URL}users`) 
  10.       .then(response => { 
  11.         if (response.ok) return response.json(); 
  12.         throw response; 
  13.       }) 
  14.       .then(json => { 
  15.         setUsers(json); 
  16.       }) 
  17.       .catch(err => { 
  18.         console.error(err); 
  19.         setError(err); 
  20.       }) 
  21.       .finally(() => { 
  22.         setLoading(false); 
  23.       }); 
  24.   }, []); 
  25.  
  26.   if (loading) return "Loading..."
  27.   if (error) return "Oops!"
  28.   return users[0].username; 

對于一個簡單的應用程序,只要發起幾個請求,就可以正常工作。但是上面的狀態聲明和 useEffect 都是模版。如果我要進行許多 HTTP 調用,我不想為每個調用重復和維護大約 20 行代碼。內聯調用讓你的代碼變得很丑。

看一下我們要解決的一些問題:

  • 聲明加載狀態
  • 聲明錯誤狀態
  • 將錯誤打印到控制臺
  • 檢查響應是否通過返回 200 response.ok
  • 如果響應正常,將響應轉換為 json 并返回 promise
  • 如果響應不正確,拋出錯誤
  • 在 finally 中隱藏加載狀態,以確保 Loading 即使發生錯誤也被隱藏
  • 聲明一個空的依賴項數組,以便 useEffect 只運行一次

這只是一個簡單的示例,它忽略了許多其他相關問題。

方式2:文件夾集中管理

如果我們在一個文件夾中處理所有 HTTP 調用會怎么樣? 使用這種方法,我們創建了一個名為 services 的文件夾,并且把進行 HTTP 調用的函數都放進去。service 是比較流行的術語,我在下面也討論了很多好的替代名稱,如 client 或 api。

 

 

 

 

要點是,所有的 HTTP 調用都是通過純 JavaScript 函數處理的,存儲在一個文件夾中。這是一個集中的 getUsers 函數:

 

  1. export function getUsers() { 
  2.   return fetch(`${process.env.REACT_APP_API_BASE_URL}users`).then(response => 
  3.     response.json() 
  4.   ); 

下面是對 getUsers 函數的調用:

 

  1. import React, { useState, useEffect } from "react"
  2. import { getUsers } from "./services/userService"
  3.  
  4. export default function CentralDemo() { 
  5.   const [users, setUsers] = useState([]); 
  6.   const [loading, setLoading] = useState(true); 
  7.   const [error, setError] = useState(null); 
  8.   useEffect(() => { 
  9.     getUsers() 
  10.       .then(json => { 
  11.         setUsers(json); 
  12.         setLoading(false); 
  13.       }) 
  14.       .catch(err => { 
  15.         console.error(err); 
  16.         setError(err); 
  17.       }); 
  18.   }, []); 
  19.  
  20.   if (loading) return "Loading..."
  21.   if (error) return "Oops!"
  22.   return users[0].username; 

然而這并沒有太簡化請求調用。主要的好處是它可以強制一致地處理 HTTP 調用。其思想是這樣的:當相關函數一起處理時,更容易一致地處理它們。如果 userService 文件夾中充滿了進行 HTTP 調用的函數,那么我可以很容易地確保它們始終如一地這樣做。此外,如果調用被復用,則很容易從這個集中位置調用它們。

然而,我們還可以做得更好。

方式3:自定義Hook

借助 React Hooks 的魔力,我們終于可以集中處理重復的邏輯。那么如何創建一個自定義 useFetch 鉤子來簡化我們的 HTTP 調用呢?

 

  1. import { useState, useEffect, useRef } from "react"
  2. // This custom hook centralizes and streamlines handling of HTTP calls 
  3. export default function useFetch(url, init) { 
  4.   const [data, setData] = useState(null); 
  5.   const [loading, setLoading] = useState(true); 
  6.   const [error, setError] = useState(null); 
  7.   const prevInit = useRef(); 
  8.   const prevUrl = useRef(); 
  9.  
  10.   useEffect(() => { 
  11.   // Only refetch if url or init params change. 
  12.     if (prevUrl.current === url && prevInit.current === init) return
  13.     prevUrl.current = url; 
  14.     prevInit.current = init; 
  15.     fetch(process.env.REACT_APP_API_BASE_URL + url, init) 
  16.       .then(response => { 
  17.         if (response.ok) return response.json(); 
  18.         setError(response); 
  19.       }) 
  20.       .then(data => setData(data)) 
  21.       .catch(err => { 
  22.         console.error(err); 
  23.         setError(err); 
  24.       }) 
  25.       .finally(() => setLoading(false)); 
  26.   }, [init, url]); 
  27.  
  28.   return { data, loading, error }; 

你的可能看起來不一樣,但我發現這個基本的使用方法很有用。這個 Hook 極大地簡化了所有調用。看看使用這個 Hook 需要多少代碼 :

 

  1. import React from "react"
  2. import useFetch from "./useFetch"
  3.  
  4. export default function HookDemo() { 
  5.   const { data, loading, error } = useFetch("users"); 
  6.   if (loading) return "Loading..."
  7.   if (error) return "Oops!"
  8.   return data[0].username; 

對于許多應用程序,你只需要一個這樣的自定義Hook。但是這個Hook已經很復雜了,并且它消除了許多問題。

但是還有很多我們沒有考慮到的點:緩存?、如果客戶端的連接不可靠,如何重新獲取?你想在用戶重新調整標簽時重新獲取新數據嗎?如何消除重復查詢?

你可以不斷完善這個自定義Hook來完成所有這些操作。但是,您應該只需要方式4:

方式4:react-query/swr

使用 react-query或swr,可以為我們處理緩存、重試、重復查詢等等。我不必維護自己的自定義Hook了。而且每個 HTTP 調用都需要很少的代碼:

 

  1. import React from "react"
  2. import { getUsers } from "./services/userService"
  3. import { useQuery } from "react-query"
  4.  
  5. export default function ReactQueryDemo() { 
  6.   const { data, isLoading, error } = useQuery("users", getUsers); 
  7.   if (isLoading) return "Loading..."
  8.   if (error) return "Oops!"
  9.   return data[0].username; 

對于大多數應用程序來說,今天這是我的首選。這是完整的代碼:https://codesandbox.io/s/4-ways-to-handle-restful-http-in-react-k3xug,你可以自己進行比較。

責任編輯:華軒 來源: code秘密花園
相關推薦

2022-11-04 13:35:29

IT遠程工作混合工作

2024-10-16 18:09:54

2021-03-10 10:13:39

爬蟲Python代碼

2014-03-17 09:22:43

Linux命令

2022-09-02 14:29:01

JavaScrip數組屬性

2023-03-17 10:51:26

2011-07-06 18:07:16

ASP

2010-08-31 15:51:51

DB2清除數據

2009-02-25 09:52:14

類型轉換.NET 強制轉型

2009-03-31 13:12:30

解析XMLJava

2011-06-22 15:21:08

XML

2020-08-10 00:30:55

備份密碼iPhone移動安全

2009-11-23 15:57:51

PHP偽靜態

2022-07-15 14:43:21

數據安全Linux

2011-08-02 17:26:38

Oracle數據庫遠程連接

2018-03-05 22:25:21

數據中心降低成本停機

2009-09-17 16:55:58

C#組件設計

2010-03-18 17:57:37

Java XMLSoc

2014-02-28 10:50:24

Linux命令

2010-08-02 16:47:46

Flex
點贊
收藏

51CTO技術棧公眾號

亚洲欧美中日韩| 国产精品久久久一区二区| 777精品伊人久久久久大香线蕉| 免费看av软件| 亚洲精品久久久久avwww潮水| 99精品国产在热久久| 夜夜嗨av一区二区三区免费区| 国产亚洲视频一区| 51av在线| 亚洲欧洲国产日韩| 狠狠色狠狠色综合人人| 中文字幕av久久爽| 韩日在线一区| 揄拍成人国产精品视频| 色哟哟网站在线观看| 偷拍视频一区二区三区| 一区二区三区自拍| 亚洲欧洲精品一区二区三区波多野1战4 | 怡春院在线视频| 伊人天天综合| 菠萝蜜影院一区二区免费| av2014天堂网| 久久国产精品免费一区二区三区| 色哟哟欧美精品| 国产精品视频网站在线观看| yjizz视频网站在线播放| caoporn国产精品| 成人深夜直播免费观看| 无码无套少妇毛多18pxxxx| 黄色精品网站| 美女黄色丝袜一区| 妖精视频在线观看免费| 亚洲区小说区图片区qvod按摩| 日韩欧美专区在线| 在线黄色免费看| 蜜桃精品在线| 精品美女国产在线| 少妇大叫太大太粗太爽了a片小说| 99re在线视频| 国产欧美一区二区三区鸳鸯浴 | 91亚洲国产高清| 亚洲人在线观看| 中文字幕av观看| 精品女人视频| 亚洲国产成人91精品| 欧美一级大片免费看| 亚洲成人a级片| 欧美军同video69gay| www.99在线| abab456成人免费网址| 色噜噜狠狠色综合欧洲selulu| 91免费黄视频| 国产va在线视频| 黑人巨大精品欧美一区免费视频| 国产中文字幕乱人伦在线观看| 麻豆福利在线观看| 亚洲国产成人av| 无码粉嫩虎白一线天在线观看 | av男人的天堂av| 自拍欧美一区| 国产亚洲精品激情久久| 久久久视频6r| 久久国产亚洲精品| 日韩视频在线免费观看| 潘金莲一级黄色片| 午夜精品久久久久99热蜜桃导演 | 亚洲人成电影在线观看天堂色 | 亚洲视频你懂的| 国产系列第一页| 中文在线观看免费| 亚洲国产视频一区二区| 黄色一级在线视频| 在线观看v片| 国产视频一区三区| 久久免费精品日本久久中文字幕| 欧美亚洲天堂网| 国产精品毛片一区二区三区| 啪一啪鲁一鲁2019在线视频| 波多野结衣激情视频| 美女精品自拍一二三四| 成人av资源在线播放| 国产高清视频免费观看| 不卡的av中国片| 日本成人三级| 黄色一级片在线观看| 亚洲国产精品嫩草影院| 国产精品免费入口| 成人在线视频观看| 日韩精品中文字幕在线一区| 一女三黑人理论片在线| 91嫩草亚洲精品| 久久久视频在线| 伊人手机在线视频| 精品一区二区在线观看| 国产精品theporn88| 蜜桃视频在线免费| 亚洲视频免费看| 成人黄色片视频| www.久久久久爱免| 亚洲精品视频在线观看视频| а天堂中文在线资源| 91久久午夜| 久久久久www| 亚洲 欧美 视频| 久久精品久久99精品久久| 国产日韩精品久久| 欧美videos极品另类| 久久亚洲一区二区三区四区| 一本一本久久a久久精品综合妖精| 欧美韩日亚洲| 欧美三级三级三级爽爽爽| 一本色道久久hezyo无码| 经典一区二区| 97视频在线观看免费高清完整版在线观看 | 一级特黄大欧美久久久| 99视频在线免费| 9l视频自拍蝌蚪9l视频成人 | 七七久久电影网| 欧美丝袜第三区| 自拍视频一区二区| 欧美freesex交免费视频| 国产精品成av人在线视午夜片| 亚洲欧美另类综合| 亚洲人精品午夜| 中文字幕国内自拍| 久久99视频| 91精品国产电影| 高清乱码毛片入口| 一区二区在线观看免费视频播放| 污色网站在线观看| 欧美猛男做受videos| 欧美亚洲国产日韩2020| 日韩精品人妻中文字幕| 久草热8精品视频在线观看| 欧洲亚洲一区| 在线免费看h| 亚洲黄色片网站| 精品欧美一区二区久久久久| 久久电影国产免费久久电影| 亚洲7777| 九七电影院97理论片久久tvb| 亚洲美女av电影| 91午夜视频在线观看| 成人av电影免费在线播放| 高清无码一区二区在线观看吞精| 国产午夜久久av| 久久精品99久久久久久久久| 97人妻一区二区精品免费视频| 中文字幕精品三区| 久久人人爽av| 国产精品99久久| 91色在线视频| 91三级在线| 日韩欧美国产一区在线观看| 看片网站在线观看| 懂色av一区二区三区免费观看| 国产经品一区二区| a天堂中文在线官网在线| 777色狠狠一区二区三区| 色婷婷在线视频观看| 激情综合一区二区三区| 久久99国产精品一区| 日本精品在线播放| 国内精品一区二区三区四区| 艳母动漫在线看| 91国产福利在线| 亚洲午夜精品久久久久久高潮| 毛片av一区二区三区| 中文字幕中文字幕在线中心一区| 激情五月综合婷婷| 韩国三级日本三级少妇99| 日韩精品系列| 精品视频在线视频| 麻豆天美蜜桃91| 成人午夜视频网站| 亚洲人成色77777| 欧美大片aaaa| 国产精品我不卡| 日韩电影毛片| 色yeye香蕉凹凸一区二区av| 亚洲av综合色区无码一二三区 | 久久久无码精品亚洲日韩按摩| 一级特黄性色生活片| 国产精品x453.com| 精品无码久久久久久久动漫| 成人在线视频播放| 久久国产色av| 欧美香蕉爽爽人人爽| 欧美日韩电影在线| 日韩大片免费在线观看| 中文成人综合网| 欧美图片自拍偷拍| 日韩av一区二区三区四区| 久久久久久av无码免费网站下载| 国产99久久| http;//www.99re视频| 欧美日韩成人影院| 色综合久久88色综合天天看泰| 黄色片免费在线| 日韩精品最新网址| 中文字幕丰满人伦在线| 亚洲国产aⅴ天堂久久| 欧美乱大交做爰xxxⅹ小说| 国产成人日日夜夜| 国产高潮免费视频| 99国产精品久久久久久久成人热| 亚洲欧美日韩不卡| 精品视频国产| 久久婷婷开心| 成人知道污网站| 国产在线精品播放| 欧美一区久久久| 久久久久亚洲精品国产| 美女国产在线| 一区二区成人av| 亚洲av激情无码专区在线播放| 日韩一区二区三区免费观看| 中文字幕无线码一区| 欧美日韩国内自拍| 国产真实夫妇交换视频| 亚洲色图视频网站| 奇米网一区二区| 国产亚洲欧美中文| 亚洲av无码一区二区三区网址| 国产一区在线视频| 天天干天天操天天做| 日韩主播视频在线| 精品视频一区二区在线| 国产欧美精品久久| 9久久9毛片又大又硬又粗| 欧美日韩精品| 国产91在线亚洲| 欧美激情一区| 国产一级不卡视频| 中文字幕乱码亚洲无线精品一区| 一区二区视频国产| 色综合狠狠操| 伊人久久大香线蕉午夜av| 欧美日韩亚洲在线观看| 日韩区国产区| 欧美中文字幕一区二区| 日韩电影免费观看高清完整| 国产精品亚洲片在线播放| 欧美午夜精品久久久久免费视| 色先锋久久影院av| 久久久精品国产一区二区三区| 日韩三级毛片| 欧美一区免费视频| 欧美日韩中字| 永久久久久久| 亚洲精品国产成人影院| www.69av| 伊人狠狠色j香婷婷综合| www..com日韩| 亚洲男人影院| av丝袜天堂网| 久久99热这里只有精品| 日本成人xxx| 国产不卡在线一区| 这里只有精品在线观看视频| 91一区二区三区在线观看| 美女被到爽高潮视频| 日本一区二区三区久久久久久久久不 | 欧美中文在线| 中文字幕日韩综合av| 免费观看在线黄色网| 九色精品免费永久在线| 成年男女免费视频网站不卡| 日本成熟性欧美| 懂色aⅴ精品一区二区三区| 亚洲bt欧美bt日本bt| 国产suv精品一区| 神马影院我不卡午夜| 午夜影院欧美| 青青青青草视频| 日韩精品视频网站| 日韩欧美中文在线视频| 97久久精品人人做人人爽| 99精品欧美一区二区| 一区二区三区国产| 亚洲天堂视频网站| 欧美精品一卡两卡| 少妇av一区二区| 丝袜亚洲欧美日韩综合| 污片在线免费观看| 国产mv久久久| 欧美精品三级在线| 免费av在线一区二区| 在线不卡一区| 国产伦精品一区二区三区高清| 教室别恋欧美无删减版| 欧美高清中文字幕| 日本亚洲欧美天堂免费| 少妇熟女视频一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 免费亚洲一区二区| 一个色综合网| 日韩中文字幕组| 风间由美一区二区三区在线观看| 六月婷婷七月丁香| 一区二区成人在线| 中文在线观看av| 日韩激情在线视频| av毛片在线播放| 国产精品丝袜久久久久久不卡| 国产精品丝袜在线播放| 在线视频一区观看| 丝袜诱惑制服诱惑色一区在线观看 | 久久一日本道色综合| 精品在线免费观看视频| 欧美精品丝袜久久久中文字幕| 无码精品在线观看| 欧美大片免费看| 91成人精品观看| 日本一区视频在线播放| 一本久道综合久久精品| 香蕉视频1024| 综合久久一区二区三区| 波多野结衣一区二区在线| 日韩精品高清在线| heyzo在线欧美播放| 91精品国产综合久久久久久丝袜| 操欧美老女人| 精品久久久久久久无码| 91毛片在线观看| 久久露脸国语精品国产91| 日韩欧美国产精品| 国产在线观看免费麻豆| 国产欧美va欧美va香蕉在| 欧洲激情视频| 国产一区亚洲二区三区| www.av亚洲| 国产精品7777777| 亚洲国产精品99久久| 麻豆av在线播放| 粉嫩精品一区二区三区在线观看| 自拍欧美日韩| 日批视频在线看| 亚洲码国产岛国毛片在线| 国产视频在线免费观看| 久久偷看各类女兵18女厕嘘嘘| 成人免费黄色| 自拍偷拍亚洲色图欧美| 精品中文字幕一区二区小辣椒| 91香蕉国产视频| 欧美日韩国产电影| 日本最新在线视频| 91在线免费观看网站| 91av精品| 国产ts在线观看| 亚洲444eee在线观看| 亚洲 欧美 激情 另类| 91精品国产高清久久久久久91| 色婷婷av一区二区三区丝袜美腿| 国产主播在线看| 久久久国产一区二区三区四区小说| 国产精品久久久久久人| 中文字幕精品久久久久| 亚洲日本免费电影| 一二三四中文字幕| 成人动漫精品一区二区| 欧美性猛交bbbbb精品| 国产小视频国产精品| 自拍偷拍亚洲图片| 久久亚洲国产成人精品无码区| 波多野洁衣一区| 日韩 国产 欧美| 久久精品99久久香蕉国产色戒| 91精品国产自产在线丝袜啪| 秋霞无码一区二区| 国产日韩欧美精品一区| 国产精品国产一区二区三区四区 | h视频久久久| 97国产在线播放| 免费观看在线色综合| 蜜桃av免费在线观看| 日韩无一区二区| 自拍偷拍欧美视频| 一本久道久久综合| 不卡av免费在线观看| 中文天堂在线资源| 欧美激情精品久久久久| 欧美美女在线| 成人做爰69片免费| 色一情一乱一乱一91av| 成人在线视频亚洲| 欧美日韩成人一区二区三区| 国产综合一区二区| www.av麻豆| 波霸ol色综合久久| 亚洲欧洲免费| 手机在线播放av| 欧美视频完全免费看| 国产嫩草在线视频| 一区二区三区四区不卡| 99精品视频中文字幕| 精品国产亚洲AV| 国产精品羞羞答答| 国产亚洲一级| 日本天堂中文字幕|