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

官方答:在React18中請求數據的正確姿勢(其他框架也適用)

開發 前端
本文我們聊聊React18之后「不推薦的請求數據的方式」以及「推薦的請求數據」的方式。

大家好,我卡頌。

一些同學喜歡在useEffect中請求初始數據,類似這樣:

useEffect(() => {
fetch(xxx).then(data => setState(data.json()))
}, [])

但??React18??并不推薦這種方式。

這么寫有什么問題?如果不推薦這種方式,那么推薦的方式是什么呢?

本文來看看??Dan??在reddit[1]是如何回答上述問題的。

這是一個普遍的問題

除了React外,大部分以「組件」形式組織的前端框架,都有如下類似的API:

  • effect。
  • didMount/didUpdate。

如果有「初始化時請求數據」的需求,這類框架都會選擇在上述回調函數內執行請求操作,并在數據返回后更新狀態。

所以,這并不是React獨有的問題。相反,他很普遍。

之所以在React中這么突出,是因為React官方在引導開發者不要用這種形式書寫代碼(通過「嚴格模式下useEffect執行兩次」放大這個問題)。

而React之所以這么做,是為了項目的「性能」以及「UX」(User Experience,用戶體驗)。

下面我們來細聊這么做的影響。注意,這些影響同樣適用于其他框架。

為什么不推薦這么寫?

需要解決競態問題

在useEffect中請求數據要面臨的第一個問題是「需要解決競態問題」。

假設你有個組件User,接收userID作為props,用userID請求數據后展示用戶信息。

下面是你的寫法:

function User({userID}) {
const [data, setData] = useState(null);
useEffect(() => {
const res = await fetch(`https://xxx/${userID}/`);
setData(res.json());
}, [userID]);
if (data) {
return <div>{data.name}</div>;
}
return null;
}

這里有個開發階段很難復現的bug —— 如果userID變化足夠快,會發起多個不同的用戶請求。

而最終展示哪個用戶的數據,取決于哪個請求先返回。這就是「請求的競態問題」。

點擊返回按鈕后重新請求數據

如果用戶跳轉到新的頁面后,又通過瀏覽器回退按鈕回到當前頁面,并不能立刻看到他跳轉前的頁面。

相反,看到的可能是個白屏 —— 因為還需要重新執行useEffect獲取初始數據。

這個問題的本質原因是:沒有初始數據的緩存。

CSR時的白屏時間

CSR(Client-Side Rendering,客戶端渲染)時在useEffect中請求數據,在數據返回前頁面都是白屏狀態。

瀑布問題

如果父子組件都依賴useEffect獲取初始數據渲染,那么整個渲染流程如下:

  1. 父組件mount。
  2. 父組件useEffect執行,請求數據。
  3. 數據返回后重新渲染父組件。
  4. 子組件mount。
  5. 子組件useEffect執行,請求數據。
  6. 數據返回后重新渲染子組件。

可見,當父組件數據請求成功后子組件甚至還沒開始首屏渲染。

這就是渲染中的瀑布問題 —— 數據像瀑布一樣一級一級向下流動,流到的組件才開始渲染,很低效。

既然直接寫useEffect有這么多問題,那么推薦的方式是什么呢?

推薦的方式

在Meta公司內部,基于Relay驅動數據(但請求數據要求使用GraphQL),所以這套架構比較難在社區普及開。

但是,現在社區已經有了成熟的「請求數據的方案」。

對于SSR,可以使用Next.js、Remix接管數據請求。

對于CSR,可以使用React Query、useSWR接管數據請求。

這些成熟的方案都致力于解決上述提到的問題。

如果不想使用這些方案,想自己寫,可以參考React新文檔中下面兩篇文章:

  • 使用effect同步數據[2]
  • 你可能不需要使用effect[3]

想看中文的同學,可以看我寫的總結 ——?? React新文檔:不要濫用effect哦!??

總結

本文我們聊了React18之后「不推薦的請求數據的方式」以及「推薦的請求數據」的方式。

其中「不推薦的請求數據的方式」不僅存在于React中,很多前端框架都有這樣的問題。

參考資料

[1]reddit:https://www.reddit.com/r/reactjs/comments/vi6q6f/what_is_the_recommended_way_to_load_data_for/。

[2]使用effect同步數據:https://beta.reactjs.org/learn/synchronizing-with-effects#fetching-data。

[3]你可能不需要使用effect:https://beta.reactjs.org/learn/you-might-not-need-an-effect#fetching-data。

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-06-16 06:05:25

React18React

2021-11-01 19:49:55

React組件模式

2022-05-16 08:00:55

ReactReact 18數組

2021-06-22 07:45:57

React18startTransiReact

2022-03-16 17:01:35

React18并發的React組件render

2023-03-21 08:31:13

ReconcilerFiber架構

2021-06-22 07:30:07

React18Automatic b自動批處理

2022-04-27 07:37:42

ReactReact18

2021-11-05 10:36:19

性能優化實踐

2022-03-30 14:22:55

ReactReact18并發特性

2025-02-12 08:07:40

2023-03-28 07:59:57

ReactReconciler

2022-03-25 08:31:09

ReactReact 18升級

2016-12-12 08:48:24

2019-12-27 15:58:57

大數據IT互聯網

2021-11-29 06:05:31

React組件前端

2018-01-11 15:31:39

命令Linux關機

2024-09-09 11:11:45

2021-09-28 14:15:23

Ubuntu 20.0LinuxSSH

2022-07-06 15:07:47

React開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久国产 | 免费看国产一级特黄aaaa大片 | 中文字幕在线精品 | 一区在线观看视频 | 日韩视频在线播放 | 成人国产精品久久久 | 97av视频| 日本色综合 | 久草视频2 | 成人黄色电影在线观看 | 国产欧美二区 | 国产91九色 | 国产亚洲精品久久午夜玫瑰园 | 中午字幕在线观看 | 国产免费观看视频 | 国产自产c区 | 成人免费视频在线观看 | 久久久国产一区二区三区 | 国产精品99久久久久久大便 | 99精品视频在线 | 一级特黄色毛片 | 国产精品福利一区二区三区 | 欧美极品视频在线观看 | 久久偷人| 成人永久免费视频 | 最新国产精品视频 | 国产成人免费视频 | 自拍偷拍中文字幕 | 国产91色在线 | 亚洲 | 国产精品国产馆在线真实露脸 | 久久久久成人精品免费播放动漫 | 一区二区三区在线 | 亚洲精品在线免费播放 | 天天操夜夜操免费视频 | 亚洲人va欧美va人人爽 | 亚洲日韩中文字幕一区 | 免费视频成人国产精品网站 | 国产欧美一区二区三区日本久久久 | 欧美综合一区 | 激情欧美一区二区三区中文字幕 | 国产精品国产亚洲精品看不卡15 |