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

為什么useEffect不適合進(jìn)行API調(diào)用

譯文 精選
開發(fā)
對useEffects進(jìn)行API調(diào)用可能很容易出錯或非常慢

  作者丨Rojan Maharjan

  譯者 | 涂承燁

  React團(tuán)隊(duì)在useEffect鉤子中做出的設(shè)計(jì)選擇仍然是一個熱議的話題。有些人喜歡,有些人不喜歡。

  如果你不是來自React世界,這聽起來肯定很奇怪,因?yàn)樗哪J(rèn)行為是非常容易遇到的可怕的“無限渲染循環(huán)”。例如:

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

       看起來很好,對吧?

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

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

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

  就這樣,我們修復(fù)了這個問題,上面的代碼應(yīng)該只運(yùn)行一次,對嗎?

  技術(shù)上來說,但并不總是如此……

嚴(yán)格模式問題

  在開發(fā)模式下,如果你想享受React嚴(yán)格模式的好處,這實(shí)際上會被調(diào)用兩次。你已經(jīng)知道為什么這是一個問題了。以下面的代碼為例:

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

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

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

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

  但從本質(zhì)上說,這是一個問題,至少不是一個優(yōu)雅的解決方案。

性能問題

  根據(jù)官方文檔,useEffect鉤子在整個UI或組件渲染完成后運(yùn)行。因此,當(dāng)我們在其中放入一個API調(diào)用時,API調(diào)用將在UI完成完整呈現(xiàn)后啟動,如下所示:

圖片

  這并不是最優(yōu)的,因?yàn)楸M管react是快速的,但渲染UI總是會消耗一些時間,它將延遲我們的API調(diào)用,而這也可以在渲染開始時運(yùn)行。

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

  我們該怎么做呢?

React查詢來解決

  React query和我們討論的完全一樣,像useQuery這樣的鉤子會在渲染開始時立即獲取數(shù)據(jù),所以你不必等待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不僅在頁面加載時立即執(zhí)行query,而且還在react query返回的單個對象中處理許多事情,如加載狀態(tài)、錯誤狀態(tài)和實(shí)際數(shù)據(jù)。

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

queryClient.invalidateQueries(['data'])

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

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

結(jié)論

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

譯者簡介

  涂承燁,51CTO社區(qū)編輯,信息系統(tǒng)項(xiàng)目管理師、信息系統(tǒng)監(jiān)理師、PMP,某省綜合性評標(biāo)專家,擁有15年的開發(fā)經(jīng)驗(yàn)。對項(xiàng)目管理、前后端開發(fā)、微服務(wù)、架構(gòu)設(shè)計(jì)、物聯(lián)網(wǎng)、大數(shù)據(jù)等較為關(guān)注。

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

責(zé)任編輯:張潔 來源: 51CTO技術(shù)棧
相關(guān)推薦

2021-01-31 18:52:36

Rust開發(fā)Web API

2009-01-08 17:15:29

服務(wù)器虛擬化高性能計(jì)算

2012-06-25 14:09:58

2024-10-06 13:00:05

2010-01-08 09:13:28

2018-03-27 10:52:59

程序員不適合C++

2022-07-12 14:04:19

Kafka

2015-03-12 13:39:48

Hadoop場景大數(shù)據(jù)

2013-08-16 10:00:45

VMwareOpenStack

2018-07-17 10:16:33

Arch Linux服務(wù)器操作系統(tǒng)

2018-07-29 07:58:34

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)產(chǎn)品

2009-01-15 18:30:11

服務(wù)器虛擬化VMware

2019-08-29 10:33:52

開發(fā)技能代碼

2013-08-13 14:33:17

程序員

2012-03-13 15:28:47

Kindle Fire傲游

2013-12-09 10:16:03

Android firAndroid開發(fā)移動創(chuàng)業(yè)

2010-07-20 09:56:53

VDI部署

2015-07-23 11:26:35

虛擬化負(fù)載類型

2019-08-26 00:37:19

WiFi 65GWi-Fi

2016-11-04 09:41:48

容器Docker
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 免费成年网站 | 亚洲精品综合 | 久久av一区 | 嫩草一区二区三区 | www.9191 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲一区中文字幕 | 91夜色在线观看 | 欧美日韩专区 | 亚洲综合一区二区三区 | 岛国午夜 | 亚洲欧洲精品成人久久奇米网 | 成人av免费在线观看 | www.久久精品 | 成人一区二区三区在线观看 | 99精品欧美一区二区三区 | 蜜桃av鲁一鲁一鲁一鲁 | 亚洲视频精品 | 欧洲视频一区 | 一级大黄 | 亚洲激情av | 日美女逼逼| 亚洲一区精品在线 | 国产精品久久久久免费 | 国产一区 | 国产精品日韩在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 国产高清一区二区三区 | 欧美午夜在线 | 免费久久网 | 免费在线观看av网址 | 天天插天天搞 | 日本久久精品视频 | 一级免费看片 | 中国一级特黄真人毛片免费观看 | 殴美成人在线视频 | 亚洲色综合 | 国产福利在线视频 | 精品一区二区三区四区视频 | 97影院2 | 久久一区二区精品 |