簡體   English   中英

useCallBack 和 useEffect 無限循環

[英]useCallBack and useEffect infinite loop

根據下面的代碼,每當inView為 true 時,我都需要調用一個函數,但是使用useEffectuseCallback列出依賴項,我會導致無限循環。 我設法避免它的唯一方法是不列出依賴項,但我收到警告,我必須列出它們。 我只嘗試了useEffect ,但結果是一樣的,列出了依賴項,循環有問題。 這是代碼:

import { useEffect, useCallback } from "react";
import { useInView } from "react-intersection-observer";

export const useLazyLoader = (onEnterView: () => void) => {
  const [ref, inView] = useInView({
    triggerOnce: true,
    rootMargin: "-200px",
  });

  const innerEnterView = useCallback(() => {
    onEnterView();
  }, [onEnterView]);

  useEffect(() => {
    inView && innerEnterView();
  }, [inView, innerEnterView]);
  return ref;
};

在這個例子中,如果我刪除任何依賴項來試圖避免這個問題,我最終會收到這樣的警告:

Line 16:6:  React Hook useEffect has a missing dependency: 'innerEnterView'. Either include it or remove the dependency array  react-hooks/exhaustive-deps

無限循環最可能的原因是 onEnterView。 為確保這是原因,請向我們展示該函數的創建位置。 我認為會發生什么(我有 99.99% 的把握)是您在某個父級中創建了一個箭頭函數(沒有將它包裝在 useCallback 中)。 調用 onEnterView 使該父級重新呈現(您說您調用了 dispatch) ,這也意味着 onEnterView 函數的引用將更改。 結果是你每次調用 useLazyLoader 鈎子時都會得到一個新的 onEnterView,所以你在那里的 useCallback 幾乎沒用(你每次都會得到不同的依賴,所以他重新創建了 useCallback 結果)。 要解決您的問題,請將 onEnterView 包裝在 useCallback 中定義的位置,而不是使用它的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM