成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么useEffect不適合進行API調用

譯文 精選
開發
對useEffects進行API調用可能很容易出錯或非常慢

  作者丨Rojan Maharjan

  譯者 | 涂承燁

  React團隊在useEffect鉤子中做出的設計選擇仍然是一個熱議的話題。有些人喜歡,有些人不喜歡。

  如果你不是來自React世界,這聽起來肯定很奇怪,因為它的默認行為是非常容易遇到的可怕的“無限渲染循環”。例如:

useEffect(()=>{console.log("Hello World")})

       看起來很好,對吧?

  不,這將在每次渲染中打印“Hello World”,React dev模式下強迫癥的我會迫不及待地將結果放置到第二個參數的依賴數組中,像這樣:

useEffect(()=>{console.log("Hello World")},[])

因此,我們必須始終手動確保每次使用它時不會陷入無限循環。

  就這樣,我們修復了這個問題,上面的代碼應該只運行一次,對嗎?

  技術上來說,但并不總是如此……

嚴格模式問題

  在開發模式下,如果你想享受React嚴格模式的好處,這實際上會被調用兩次。你已經知道為什么這是一個問題了。以下面的代碼為例:

useEffect(()=>{
api.post("/view",{})
},[])

  假設我們有一個代碼,它發送一個事件,說用戶像上面的useEffect一樣查看了頁面。在嚴格模式下,React將運行這個效果兩次,并發送一個雙重事件。

  你可以讓hacky參考下面這樣來工作:

export default function useEffectOnce(fn: () => void) {
const ref = useRef(false);
useEffect(() => {
if (ref.current) {
fn();
}
return () => {
ref.current = true;
};
}, [fn]);
}

  但從本質上說,這是一個問題,至少不是一個優雅的解決方案。

性能問題

  根據官方文檔,useEffect鉤子在整個UI或組件渲染完成后運行。因此,當我們在其中放入一個API調用時,API調用將在UI完成完整呈現后啟動,如下所示:

圖片

  這并不是最優的,因為盡管react是快速的,但渲染UI總是會消耗一些時間,它將延遲我們的API調用,而這也可以在渲染開始時運行。

  因此,更好的方法是獲取數據且并行渲染它。

  我們該怎么做呢?

React查詢來解決

  React query和我們討論的完全一樣,像useQuery這樣的鉤子會在渲染開始時立即獲取數據,所以你不必等待React加載完整個組件,如下所示:

圖片

下面是一個例子:

// with react query
const { status, data, error, isFetching } = useQuery(
['data'],
async () => {
const data = await (
await fetch(`${API_BASE_URL}/data`)
).json()
return data
}
)// without react query
useEffect(() => {
try {
setLoading(true)(async () => {
const data = await (await fetch(`${API_BASE_URL}/data`)).json();
setData(data);
})();
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
}, []);

  通過查看語法,我們可以看到react query不僅在頁面加載時立即執行query,而且還在react query返回的單個對象中處理許多事情,如加載狀態、錯誤狀態和實際數據。

  此外,重新運行/使查詢無效很簡單,如下所示。

queryClient.invalidateQueries(['data'])

其他一些著名的庫也解決了這些問題,如SWR、URQL和Apollo Client。

  解決該問題的另一種方法是執行SSR,以便數據先在后端渲染,或者使用react-router 加載器等功能。

結論

  對useEffects進行API調用可能很容易出錯或非常慢。所以,除非不得已,否則最好避免使用。同時,建議你通過一些庫來處理數據的獲取更為合適。

譯者簡介

  涂承燁,51CTO社區編輯,信息系統項目管理師、信息系統監理師、PMP,某省綜合性評標專家,擁有15年的開發經驗。對項目管理、前后端開發、微服務、架構設計、物聯網、大數據等較為關注。

  原文鏈接:??https://articles.wesionary.team/why-useeffect-is-a-bad-place-to-make-api-calls-98a606735c1c??

責任編輯:張潔 來源: 51CTO技術棧
相關推薦

2021-01-31 18:52:36

Rust開發Web API

2024-10-06 13:00:05

2009-01-08 17:15:29

服務器虛擬化高性能計算

2012-06-25 14:09:58

2010-01-08 09:13:28

2018-03-27 10:52:59

程序員不適合C++

2022-07-12 14:04:19

Kafka

2013-08-16 10:00:45

VMwareOpenStack

2018-07-17 10:16:33

Arch Linux服務器操作系統

2015-03-12 13:39:48

Hadoop場景大數據

2019-08-29 10:33:52

開發技能代碼

2009-01-15 18:30:11

服務器虛擬化VMware

2018-07-29 07:58:34

物聯網IOT物聯網產品

2010-07-20 09:56:53

VDI部署

2012-03-13 15:28:47

Kindle Fire傲游

2013-12-09 10:16:03

Android firAndroid開發移動創業

2013-08-13 14:33:17

程序員

2016-11-04 09:41:48

容器Docker

2015-07-23 11:26:35

虛擬化負載類型

2019-08-26 00:37:19

WiFi 65GWi-Fi
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精精国产xxxx视频在线野外 | 国产一区91精品张津瑜 | 久久久91精品国产一区二区三区 | 91精品国产一区二区三区 | 精品欧美一区免费观看α√ | 男人电影天堂 | 亚洲网站在线观看 | 亚洲精品日韩综合观看成人91 | 91在线电影 | 毛片一区 | 国产日韩欧美 | 午夜精品久久久久久久星辰影院 | 一区二区视频 | 久久免费精彩视频 | 日韩午夜影院 | 亚洲精品久久久久久久久久久久久 | 日本天堂视频在线观看 | 亚洲国产专区 | 亚洲 自拍 另类 欧美 丝袜 | 亚洲精品久久久久久久久久久久久 | 亚洲国产精品一区在线观看 | 国产精品久久久亚洲 | 精品av| 亚洲色图网址 | 男人的天堂久久 | 久久大 | 亚洲欧美视频 | 日韩网站在线观看 | 国产精品欧美一区二区三区不卡 | 中文字幕 亚洲一区 | 欧美一区二区三区在线看 | 国产精品久久午夜夜伦鲁鲁 | 日韩在线观看精品 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 91视频88av| 国产剧情一区 | 女女百合av大片一区二区三区九县 | 97精品国产 | 精品在线一区 | 欧美性视频在线播放 | 国产91精品网站 |