簡體   English   中英

反應鈎子避免重新渲染並保留所需的deps

[英]react hooks avoid re-render and keep required deps

我錯過了 useEffect、useCallback 和 deps 的一些東西。

我有一個上下文和一個組件。 我的組件使用 fetch() 加載我需要的所有數據,並在上下文中將 boolean 設置為 true 以顯示微調器。 當我需要時,我會在另一個組件中使用上下文。

const LoadingApp = ({children}) => {
    const loadingContext = useContext(LoadingContext);

    const fetchMyData = useCallback(() => {
        loadingContext.setLoading(true);
    }, [loadingContext]);


    useEffect(() => {
        fetchMyData();
    }, [fetchMyData]);

    return (
        <React.Fragment>
            {children}
        </React.Fragment>
    );
};


const LoadingProvider = ({children}) => {
    const [loading, setLoading] = useState(false);

    const setLoading = useCallback((isLoading) => {
        setLoading(loading + (isLoading ? 1: -1));
    }, [setLoading, loading]);

    const isLoading = useCallback(() => {
        return loading > 0;
    }, [loading]);

    return (
        <LoadingContext.Provider value={{setLoading, isLoading}}>
            {children}
        </LoadingContext.Provider>
    )
}

我知道我可以從 useEffect 或 useCallback 中刪除 deps,但這似乎是解決我的問題的錯誤方法,因為需要 deps。

如何在 useEffect 或 useCallback 的上下文中調用 function 而無需重新渲染所有內容?

如果您正在調用setLoading ,那么您總是會觸發您想要的重新渲染。

你可以有一個空的deps ,這意味着效果只會運行一次。

loading值改變時,上下文總是改變。 useEffect的依賴項更改為僅依賴於setLoading ,它基於useCallbackuseState setter 也不會更改),並且將保持固定。

const { setLoading } = useContext(LoadingContext);

const fetchMyData = useCallback(() => {
  setLoading(true);
}, [setLoading]);

您實際上並不需要useCallback ,因為它與原始setLoading所做的事情相同。 您可以安全地刪除它:

const setLoading = useCallback((isLoading) => {
  setLoading(isLoading);
}, [loading]);

暫無
暫無

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

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