最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React18中請求數(shù)據(jù)的官方姿勢適用其他框架

 更新時間:2022年07月13日 08:33:36   作者:魔術(shù)師卡頌  
這篇文章主要為大家介紹了官方回答在React18中請求數(shù)據(jù)的正確姿勢詳解,同樣也適用其他框架,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

一些同學(xué)喜歡在useEffect中請求初始數(shù)據(jù),類似這樣:

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

React18并不推薦這種方式。

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

本文來看看Danreddit是如何回答上述問題的。

這是一個普遍的問題

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

effect

didMount/didUpdate

如果有初始化時請求數(shù)據(jù)的需求,這類框架都會選擇在上述回調(diào)函數(shù)內(nèi)執(zhí)行請求操作,并在數(shù)據(jù)返回后更新狀態(tài)。

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

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

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

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

為什么不推薦這么寫?

需要解決競態(tài)問題

useEffect中請求數(shù)據(jù)要面臨的第一個問題是需要解決競態(tài)問題。

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

下面是你的寫法:

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;
}

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

而最終展示哪個用戶的數(shù)據(jù),取決于哪個請求先返回。這就是請求的競態(tài)問題

點擊返回按鈕后重新請求數(shù)據(jù)

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

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

這個問題的本質(zhì)原因是:沒有初始數(shù)據(jù)的緩存。

CSR時的白屏?xí)r間

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

瀑布問題

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

  • 父組件mount
  • 父組件useEffect執(zhí)行,請求數(shù)據(jù)
  • 數(shù)據(jù)返回后重新渲染父組件
  • 子組件mount
  • 子組件useEffect執(zhí)行,請求數(shù)據(jù)
  • 數(shù)據(jù)返回后重新渲染子組件

可見,當(dāng)父組件數(shù)據(jù)請求成功后子組件甚至還沒開始首屏渲染。

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

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

推薦的方式

Meta公司內(nèi)部,基于Relay驅(qū)動數(shù)據(jù)(但請求數(shù)據(jù)要求使用GraphQL),所以這套架構(gòu)比較難在社區(qū)普及開。

但是,現(xiàn)在社區(qū)已經(jīng)有了成熟的請求數(shù)據(jù)的方案。

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

對于CSR,可以使用React QueryuseSWR接管數(shù)據(jù)請求。

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

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

使用effect同步數(shù)據(jù)

你可能不需要使用effect

想看中文的同學(xué),可以看我寫的總結(jié) —— React新文檔:不要濫用effect哦

總結(jié)

本文我們聊了React18之后不推薦的請求數(shù)據(jù)的方式以及推薦的請求數(shù)據(jù)的方式。

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

以上就是React18中請求數(shù)據(jù)的官方姿勢適用其他框架的詳細(xì)內(nèi)容,更多關(guān)于React18請求數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React?+?Typescript領(lǐng)域初學(xué)者的常見問題和技巧(最新)

    React?+?Typescript領(lǐng)域初學(xué)者的常見問題和技巧(最新)

    這篇文章主要介紹了React?+?Typescript領(lǐng)域初學(xué)者的常見問題和技巧,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • React使用Context與router實現(xiàn)權(quán)限路由詳細(xì)介紹

    React使用Context與router實現(xiàn)權(quán)限路由詳細(xì)介紹

    這篇文章主要介紹了React使用Context與router實現(xiàn)權(quán)限路由的詳細(xì)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • react 項目 中使用 Dllplugin 打包優(yōu)化技巧

    react 項目 中使用 Dllplugin 打包優(yōu)化技巧

    在用 Webpack 打包的時候,對于一些不經(jīng)常更新的第三方庫,比如 react,lodash,vue 我們希望能和自己的代碼分離開,這篇文章主要介紹了react 項目 中 使用 Dllplugin 打包優(yōu)化,需要的朋友可以參考下
    2023-01-01
  • React中setState使用原理解析

    React中setState使用原理解析

    這篇文章主要介紹了React中的setState使用細(xì)節(jié)和原理解析,主要包括使用setstate的原因及基本用法,本文通過實例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • react中涉及的增加,刪除list方式

    react中涉及的增加,刪除list方式

    這篇文章主要介紹了react中涉及的增加,刪除list方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React Native中Navigator的使用方法示例

    React Native中Navigator的使用方法示例

    導(dǎo)航組件Navigator可以讓我們客戶端在不同的頁面見進(jìn)行切換,下面這篇文章主要給大家介紹了關(guān)于React Native中Navigator的使用方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • React?split實現(xiàn)分割字符串的使用示例

    React?split實現(xiàn)分割字符串的使用示例

    當(dāng)我們需要將一個字符串按照指定的分隔符進(jìn)行分割成數(shù)組時,我們可以在組件的生命周期方法中使用split方法來實現(xiàn)這個功能,本文就來介紹一下,感興趣的可以了解下
    2023-10-10
  • react實現(xiàn)移動端下拉菜單的示例代碼

    react實現(xiàn)移動端下拉菜單的示例代碼

    這篇文章主要介紹了react實現(xiàn)移動端下拉菜單的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 從零開始最小實現(xiàn)react服務(wù)器渲染詳解

    從零開始最小實現(xiàn)react服務(wù)器渲染詳解

    這篇文章主要介紹了從零開始最小實現(xiàn)react服務(wù)器渲染詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • React狀態(tài)更新的優(yōu)先級機制源碼解析

    React狀態(tài)更新的優(yōu)先級機制源碼解析

    這篇文章主要為大家介紹了React狀態(tài)更新的優(yōu)先級機制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評論

赤壁市| 乐昌市| 浦江县| 沙洋县| 长顺县| 禄丰县| 竹山县| 兴宁市| 宁海县| 砀山县| 张家口市| 微博| 比如县| 罗江县| 鄂托克前旗| 丰都县| 浦江县| 汉中市| 荆州市| 新源县| 许昌市| 南通市| 奉节县| 阳高县| 项城市| 东乡族自治县| 九龙城区| 荥阳市| 昌宁县| 财经| 宁海县| 蓬安县| 西乌| 新安县| 丹巴县| 苗栗县| 怀仁县| 广丰县| 子长县| 乌苏市| 南宫市|