React.memo 與 React.useMemo 的區別


1. 關於 React.memo 的相關描述

React.memo 函數是一個高階組件,通常我們用它來包裹一個組件(函數的入參)。

它會檢查入參組件的props的變更,相同的props會渲染相同的結果(跳過本次渲染操作並復用上一次的渲染結果)。

如果其包裹的是函數組件,並且該函數組件內部使用到了某些hook(類似useState、useContext等),當state或者context發生變化時,該組件仍會重新渲染。

function memo<P extends object>(
    Component: FunctionComponent<P>,
    propsAreEqual?: (prevProps: Readonly<PropsWithChildren<P>>, nextProps: Readonly<PropsWithChildren<P>>) => boolean
): NamedExoticComponent<P>;

function memo<T extends ComponentType<any>>(
    Component: T,
    propsAreEqual?: (prevProps: Readonly<ComponentProps<T>>, nextProps: Readonly<ComponentProps<T>>) => boolean
): MemoExoticComponent<T>;

默認情況下,memo函數只會對復雜對象做淺比較,如果想要手動控制比對過程,可以將自定義的比較函數通過第二個參數傳入來實現。

function TestComponent {}

function areEqual(prevProps, nextProps) {
  // 如果prevProps與nextProps一致,則返回true,否則返回false  
}

export default React.memo(TestComponent, areEqual);

React.memo是作為一種渲染性能優化手段而存在的。

例如,父組件重新render,通常其子組件也會重新渲染(盡管其外部props和內部state並沒有產生變化),這時為了避免子組件產生不必要的渲染,可以使用memo將其包裹,當props未發生變化時,可以不重新渲染。

 

2. 關於 React.useMemo 的相關描述

React.useMemo 也是用來調節控制渲染流程的,而且相對來說其顆粒度更細(通常是一個具體的值、狀態、函數,而不是組件)。

它會返回一個 memoized 值,且僅會在某些依賴項發生改變時才會重新計算(有點類似Vue的computed屬性),有助於避免在每次渲染時都進行高開銷的計算。

它可以避免因一些 函數發生了不必要的更新 而觸發的組件的重新渲染。

function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;

useMemo接受兩個參數,分別是:“創建”函數依賴項數 ,

如果不傳依賴數組,傳入的函數每次都會重新執行計算;

如果傳空的依賴數組,則返回值被初始化后,不會再變化。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

 

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM