精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久99热国产| 91亚洲无吗| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲精品久久视频| 日本成年人网址| 六月婷婷综合网| 美女视频一区免费观看| 亚洲国产精品va在线看黑人动漫| 美女在线免费视频| 人人妻人人澡人人爽久久av| 老牛影视一区二区三区| 日韩av在线网页| 91网址在线播放| 天堂av在线电影| 91色porny在线视频| 91精品久久久久久久久久 | 欧美黄色aaa| 福利视频亚洲| 欧美日韩国产一中文字不卡| 亚洲欧洲日本国产| 中文字幕在线播放不卡| 国语对白精品一区二区| 中文日韩在线视频| 日韩av手机在线播放| a成人v在线| 国产欧美精品一区二区三区四区| 国产成人精品999| 青娱乐国产在线| 波多野结衣一区二区三区免费视频| 亚洲国产精品麻豆| 在线免费观看一区二区三区| 亚洲色大成网站www| 国产麻豆视频一区二区| 国产精品h片在线播放| 五月天婷婷丁香网| 天美av一区二区三区久久| 色综合天天视频在线观看| 精品国产一区二区三区无码| 亚洲 国产 欧美 日韩| 国产又黄又大久久| 久久久免费电影| av最新在线观看| 4438全国亚洲精品观看视频| 欧美日韩国产欧美日美国产精品| 喜爱夜蒲2在线| 亚洲成a人v欧美综合天堂麻豆| 国产一区免费电影| 91精品久久久久久久久久久| 无码人妻丰满熟妇区五十路 | 欧美精品xxxxx| 久久国产电影| 欧美精品一区二区三区蜜桃| 国产又粗又猛又爽又黄| 国产精品久久久久久久久久久久久久久| 夜夜精品浪潮av一区二区三区 | 菠萝蜜一区二区| 国产午夜精品全部视频在线播放| 亚洲成人av免费观看| 日韩脚交footjobhd| 天天色综合天天| 777精品久无码人妻蜜桃| 超碰在线影院| 中文字幕免费不卡在线| 午夜精品美女久久久久av福利| 亚洲第一天堂网| 国产成人精品aa毛片| www.成人av| 国产91免费看| 久久久亚洲高清| 国产91精品入口17c| 性生活视频软件| 99久久久精品免费观看国产蜜| 91精品免费久久久久久久久| 国产精品亚洲lv粉色| 国产酒店精品激情| 国产欧美精品在线播放| 国产精品一区二区黑人巨大 | 国产亚洲精品中文字幕| 视频一区三区| av毛片在线看| 欧美日韩亚洲网| 亚欧在线免费观看| av在线国产精品| 亚洲第一偷拍网| 尤物视频最新网址| 99精品综合| 国模吧一区二区三区| 亚洲欧美精品一区二区三区| 亚洲激情午夜| 国产精品久久中文| 999免费视频| 91蜜桃婷婷狠狠久久综合9色| 国产精品三区四区| 免费理论片在线观看播放老| 国产精品初高中害羞小美女文 | 羞羞答答成人影院www| 欧美激情日韩图片| 午夜精品免费观看| 国产精品99久久久久久似苏梦涵| 成人午夜激情网| 亚州视频一区二区三区| 国产精品国产三级国产普通话99| 神马影院我不卡午夜| 成人video亚洲精品| 欧美日韩国产综合新一区| 天天影视色综合| 日韩av系列| 美女福利精品视频| 欧美brazzers| 久久国产婷婷国产香蕉| 久久久精品有限公司| 中文字幕伦理免费在线视频 | 欧美艳星kaydenkross| 91精品国产欧美一区二区18| 少妇大叫太粗太大爽一区二区| 久久av中文| 久久人人爽人人爽人人片av高清| 日韩字幕在线观看| 国产九九视频一区二区三区| 国产高清自拍99| 欧美13一16娇小xxxx| 欧美性猛交xxx| 中文字幕在线视频播放| 婷婷亚洲五月| 国产精品美乳一区二区免费| 五月婷婷丁香花| 亚洲在线视频网站| 播放灌醉水嫩大学生国内精品| 欧美黑人粗大| 日韩av最新在线观看| 久久久久久久久久久97| 国内成人精品2018免费看| 婷婷四房综合激情五月| 中文字幕21页在线看| 亚洲国产日韩精品在线| 麻豆视频在线观看| 国产成人av一区二区三区在线观看| 久久免费一区| 鲁鲁在线中文| 日韩成人久久久| 国产特黄大片aaaa毛片| 成人精品视频一区二区三区尤物| 日韩欧美激情一区二区| 国产免费不卡| 亚洲精品自拍视频| 日本一区二区三区精品| 91视频一区二区| 日韩av一二三四| 中文字幕精品影院| 国产aⅴ夜夜欢一区二区三区 | 亚洲国产精品推荐| 日本视频www| 成人高清视频在线观看| 久久精品国产sm调教网站演员| 日本午夜精品久久久久| 亚洲国模精品一区| 91玉足脚交嫩脚丫在线播放| 91美女蜜桃在线| 国产又大又黄又粗的视频| 中文字幕日韩高清在线| 久久久噜久噜久久综合| 午夜性色福利影院| 色欧美片视频在线观看| 日本三级日本三级日本三级极| 五月天久久777| 亚洲自拍av在线| av电影院在线看| 日韩精品免费看| 成人免费一级片| 91丝袜国产在线播放| 亚洲欧洲日产国码无码久久99 | 日韩欧美一级二级三级| 欧美激情精品久久| 免费看日韩精品| 男人j进女人j| 欧洲亚洲精品久久久久| 久久影视电视剧免费网站| 成人免费一级视频| 日本韩国精品在线| 亚洲 小说 欧美 激情 另类| 久久精品国产精品亚洲综合| 天堂资源在线亚洲视频| 国产一区二区视频在线看| 97精品欧美一区二区三区| 福利片在线看| 欧美大片顶级少妇| 国产乱码在线观看| 亚洲精品你懂的| 老司机久久精品| 亚洲欧洲一区二区天堂久久| 天堂一区二区三区| 久久99国产精品久久99大师| 国产精品视频一区国模私拍 | 国产精品久久久久影院亚瑟| 亚洲国产欧美日韩在线| 老鸭窝91久久精品色噜噜导演| 久久久99爱| 精品麻豆剧传媒av国产九九九| 欧美xxxx18性欧美| 青青青免费视频在线2| 欧美一区二区视频在线观看2022 | 亚洲天堂免费| 亚洲wwwav| 亚洲精品国产精品国产| www.久久久久| 青青视频在线观| 精品国产伦理网| 91激情在线观看| 色综合久久综合中文综合网| 日韩精品电影一区二区| 国产成人午夜视频| 五十路熟女丰满大屁股| 亚洲欧洲中文字幕| 午夜视频久久久| 蜜桃精品wwwmitaows| 成人免费视频观看视频| zzzwww在线看片免费| 欧美精品在线观看| 男女啪啪在线观看| 国产亚洲成精品久久| 四虎在线视频免费观看| 日韩亚洲欧美一区二区三区| 中文字幕一区二区三区四区免费看| 亚洲乱码国产乱码精品精98午夜| 免费不卡的av| 国产精品99久久久久久久女警 | 91精品国产综合久久婷婷香蕉 | 中文字字幕码一二三区| 国产成人a级片| 波多野结衣三级视频| 国产主播一区二区| 爱豆国产剧免费观看大全剧苏畅| 亚洲三级色网| 一本久道高清无码视频| 欧美久久综合| 欧美成人高清视频| 国产爆初菊在线观看免费视频网站| 欧美高清你懂得| 中文字幕有码无码人妻av蜜桃| 亚洲综合视频在线| 1024手机在线视频| 91小视频在线| 精品人妻一区二区三区视频| 91欧美激情一区二区三区成人| 色婷婷一区二区三区在线观看| 99热精品在线观看| 人人妻人人添人人爽欧美一区| 99久久夜色精品国产亚洲1000部| 黄色小网站91| 日韩丝袜视频| 日韩欧美视频第二区| 日韩中文在线电影| 亚洲欧美一区二区原创| 亚洲精品小说| 四虎影院一区二区三区 | 国产高潮久久久| 精品欧美一区二区三区| 中文字幕在线播| 香蕉加勒比综合久久| 国产高清视频免费在线观看| 亚洲欧美综合网| 精品99久久久久成人网站免费| 中日韩免费视频中文字幕| 成人黄色短视频| 国产日韩欧美综合在线| 日本免费网站视频| 一区二区三区在线高清| 天海翼一区二区| 欧美午夜不卡在线观看免费| 91精品国产综合久| 精品动漫一区二区三区在线观看| 国产精品久久久久久69| 欧美专区日韩专区| 国产美女激情视频| 偷拍一区二区三区| 中文在线最新版天堂| 日韩欧美国产麻豆| 国产视频一区二区三| 欧美日韩国产成人在线免费| jlzzjlzz亚洲女人18| 日韩精品视频在线播放| 亚洲xxxxxx| 高清一区二区三区四区五区| 国精产品一区二区三区有限公司| 97成人在线视频| 国产嫩草在线视频| 欧美在线视频观看| 国产精品视频一区视频二区| 久久视频在线观看中文字幕| 欧美激情偷拍自拍| 国产成人无码精品久久久性色| 日韩午夜在线电影| 亚洲一区日韩精品| 97精品久久久久中文字幕 | 国产.欧美.日韩| 级毛片内射视频| 一区二区国产视频| 潘金莲一级淫片aaaaaa播放| 欧美一级艳片视频免费观看| 国产成人三级一区二区在线观看一| 日韩一区二区视频| 国产在线超碰| 午夜精品理论片| 欧美一区一区| 亚洲国产精品视频一区| 亚洲少妇在线| 久久综合桃花网| 国产精品高潮久久久久无| 在线观看免费国产视频| 欧美一级黄色片| 91在线视频免费看| 欧美诱惑福利视频| 99a精品视频在线观看| 中文字幕av日韩精品| 欧美午夜国产| 亚洲精品国产一区二区三区| 久久久青草青青国产亚洲免观| 国产午夜精品久久久久久久久| 《视频一区视频二区| 亚洲婷婷久久综合| 精品夜色国产国偷在线| brazzers在线观看| 97久久人人超碰caoprom欧美| 青草久久视频| 无码av天堂一区二区三区| 国产一区日韩二区欧美三区| 99久久99久久精品免费看小说.| 综合欧美亚洲日本| 中文字幕久久久久| 日韩欧美国产电影| 国产视频在线播放| 欧美一性一乱一交一视频| 国产精品chinese在线观看| 国产日韩欧美大片| 国内精品久久久久影院一蜜桃| 国产麻豆剧传媒精品国产av| 亚洲综合视频在线| 成人免费公开视频| 日韩在线观看免费| 久久91视频| 中文字幕日韩一区二区三区| 奇米888四色在线精品| 极品尤物一区二区| 欧美日韩国产一区| 麻豆网在线观看| 青草成人免费视频| 欧一区二区三区| 日产国产精品精品a∨| 日日摸夜夜添夜夜添亚洲女人| 丰满少妇中文字幕| 亚洲精品大片www| 亚洲av无码一区二区三区性色| 中文字幕在线精品| 日韩黄色三级在线观看| 熟女视频一区二区三区| 日本女优在线视频一区二区| 亚洲天堂岛国片| 欧美精品一二三| av毛片在线| 国产嫩草一区二区三区在线观看| 综合激情婷婷| 在线播放av网址| 亚洲少妇屁股交4| 国产成人精品a视频| 久久色成人在线| 国产亚洲第一页| 日韩久久精品电影| 精品国模一区二区三区| 亚洲图色在线| 国产电影一区二区三区| 91浏览器在线观看| 永久免费精品影视网站| 色在线中文字幕| 亚洲国产一区二区三区在线| 国产在线精品视频| 日本一级淫片色费放| 亚洲人成毛片在线播放| 久久人人视频| 黄色三级中文字幕| 国产校园另类小说区| 伊人手机在线视频| 日韩一区二区欧美| 欧美18xxxx| 中文字幕成人免费视频| 亚瑟在线精品视频| av中文字幕在线| 国产精品视频永久免费播放| 欧美日本二区| 欧美成人国产精品一区二区| 日韩欧美在线视频免费观看| 日韩电影免费| 91网站免费看| 久久久久免费| 欧美成人国产精品高潮| 亚洲欧洲高清在线| 久久av偷拍| 天天操天天爽天天射| 亚洲高清视频在线| 免费**毛片在线| 欧美一区二区三区精美影视|