亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React?useEffect不支持async?function示例分析

 更新時間:2022年07月11日 10:28:49   作者:葡萄zi  
這篇文章主要為大家介紹了React?useEffect不支持async?function示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

useEffect相比大家都耳熟能詳啦,如下這種寫法,應(yīng)該是非常常見的需求。

useEffect(async () => {
   await getPoiInfo(); // 請求數(shù)據(jù)
}, []);

但是 React 本身并不支持這么做,理由是 effect function 應(yīng)該返回一個銷毀函數(shù)(effect:是指return返回的cleanup函數(shù)),如果 useEffect 第一個參數(shù)傳入 async,返回值則變成了 Promise,會導(dǎo)致 react 在調(diào)用銷毀函數(shù)的時候報錯 :function.apply is undefined。

React為什么這么設(shè)計呢?

1、useEffect 的返回值是要在卸載組件時調(diào)用的,React 需要在 mount 的時候馬上拿到這個值,不然就亂套了

2、useEffect() 可能有個潛在邏輯:第二次觸發(fā) useEffect 里的回調(diào)前,前一次觸發(fā)的行為都執(zhí)行完成,返回的清理函數(shù)也執(zhí)行完成。這樣邏輯才清楚。而如果是異步的,情況會變得很復(fù)雜,可能會很容易寫出有 bug 的代碼。

下面有兩種改進(jìn)的方法大家可以參考下:

簡單改造

1、簡單改造的寫法(不推薦)

第一種 在內(nèi)部創(chuàng)建一個異步函數(shù)anyNameFunction,等待他的結(jié)果,然后調(diào)用setData

但是這種方式存在一個問題,如果asyncFunction請求有依賴外部的參數(shù),如果不更新requestData 的 effect 的依賴,effect 就不會同步 props 和 state 帶來的變更,也就不回重新請求數(shù)據(jù)

useEffect(() => {
    // Create an scoped async function in the hook
    // 注意如果函數(shù)沒有使用組件內(nèi)的任何值,可以把它提到組件外面去定義
    // 下面代碼可以提到外面,可以自由地在 effect 中使用,下面就不改啦
    async function asyncFunction() {
      await requestData();
      setData(data)
    }
    // Execute the created function directly
    anyNameFunction();
 }, []); // 這里設(shè)置成[]數(shù)組,因為我們只想在掛載的時候運行它一次

或者 useEffect中異步函數(shù)采用IIFE寫法( Immediately Invoked Function Expression即立即調(diào)用的函數(shù)式表達(dá)式)

useEffect(() => {
  // Using an IIFE
  (async function anyNameFunction() {
    await requestData();
  })();
}, []);

2、把異步提取成單獨函數(shù)或自定義hook(推薦)

第一種自定義 hook包裹,然后再effect中通過promise.then調(diào)用(github上大佬給的答案:github

// 自定義hook
function useAsyncEffect(effect: () => Promise<void | (() => void)>, dependencies?: any[]) {
  return useEffect(() => {
    const cleanupPromise = effect()
    return () => { cleanupPromise.then(cleanup => cleanup && cleanup()) }
  }, dependencies)
}
// 使用
useAsyncEffect(async () => {
    const count = await fetchData()
    setCount(count)
  }, [fetchData])

或者利用useCallback 包裝成hook

useCallback 本質(zhì)上是添加了一層依賴檢查,使用useCallback,函數(shù)完全可以參與到數(shù)據(jù)流中,可以說如果一個函數(shù)的輸入改變了,這個函數(shù)就改變了,如果沒有,函數(shù)也不會改變。

下面的例子中會依賴 type ,如果 type 保持不變,requestData 也會保持不變,effect 也不會重新運行,但是如果 type 修改了,requestData 也會隨之改變,因此會重新請求數(shù)據(jù)。

// 封裝
const requestData = useCallback(async () => {
  changeLoading(true);
  changeError(false);
  changeList([]);
  requestAPI.getFeature({ type }).then((data) => {
    if (data) {
      changeList(data);
    }
  }).catch((e) => {
    changeError(true);
  }).finally(() => {
    changeLoading(false);
  });
}, [type]); // type改變會重新生成函數(shù)
// 普通接口請求
useEffect(() => { 
  requestData();
}, [requestData]);
// 單獨處理外層刷新的接口請求
// refreshing是props傳遞的過來的,不應(yīng)該與state狀態(tài)改變混在一起,這也是hook的優(yōu)勢,將不相關(guān)的狀態(tài)邏輯拆分成更細(xì)粒度
useEffect(() => { 
  if (!refreshing) { 
    return;
  }
  requestData().then(() => {
    getRefreshStatus(false);
  });
}, [refreshing]);

關(guān)于為什么不支持異步的原理可以看下這篇文章里通過源碼的分析:useEffect 中為啥不能使用 async

有任何疑問歡迎評論溝通,我會繼續(xù)更新!

其他相關(guān)文檔:

https://heptaluan.github.io/2020/11/07/React/17/

https://www.robinwieruch.de/react-hooks-fetch-data/

以上就是React useEffect不支持async function示例分析的詳細(xì)內(nèi)容,更多關(guān)于useEffect不支持async function的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React中使用antd組件的方法

    React中使用antd組件的方法

    antd?是基于?Ant?Design?設(shè)計體系的?React?UI?組件庫,主要用于研發(fā)企業(yè)級中后臺產(chǎn)品,這篇文章主要介紹了React中使用antd組件,需要的朋友可以參考下
    2022-09-09
  • react新版本生命周期鉤子函數(shù)及用法詳解

    react新版本生命周期鉤子函數(shù)及用法詳解

    這篇文章主要介紹了react新版本生命周期鉤子函數(shù)及用法詳解,本文通過示例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet)的示例代碼

    reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet)的示例代碼

    這篇文章主要介紹了reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • react實現(xiàn)動態(tài)表單

    react實現(xiàn)動態(tài)表單

    這篇文章主要為大家詳細(xì)介紹了react實現(xiàn)動態(tài)表單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • react hooks實現(xiàn)原理解析

    react hooks實現(xiàn)原理解析

    這篇文章主要介紹了react hooks實現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • React元素與組件的區(qū)別示例詳解

    React元素與組件的區(qū)別示例詳解

    這篇文章主要為大家介紹了React元素與組件的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 解決React報錯Cannot assign to 'current' because it is a read-only property

    解決React報錯Cannot assign to 'current'

    這篇文章主要為大家介紹了React報錯Cannot assign to 'current' because it is a read-only property的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React.js綁定this的5種方法(小結(jié))

    React.js綁定this的5種方法(小結(jié))

    this在javascript中已經(jīng)相當(dāng)靈活,這篇文章主要介紹了React.js綁定this的5種方法(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 原生+React實現(xiàn)懶加載(無限滾動)列表方式

    原生+React實現(xiàn)懶加載(無限滾動)列表方式

    這篇文章主要介紹了原生+React實現(xiàn)懶加載(無限滾動)列表方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    useMemo是一個react hook,我們可以使用它在組件中包裝函數(shù)。可以使用它來確保該函數(shù)中的值僅在依賴項之一發(fā)生變化時才重新計算,這篇文章主要介紹了react?函數(shù)組件輸入卡頓問題?usecallback?react.memo,需要的朋友可以參考下
    2022-07-07

最新評論