react中的forwardRef 和memo的區(qū)別解析
介紹
forwardRef 和 memo 是 React 中用于性能優(yōu)化和組件復用的兩個高階函數(shù)。
forwardRef
forwardRef:通常情況下,父組件通過 ref 屬性傳遞給子組件的引用只能是 DOM 元素或類組件的實例。但有時候我們希望將 ref 傳遞給函數(shù)組件內(nèi)部的某個具體元素或組件,這時就可以使用 forwardRef。
forwardRef 可以傳遞一個回調(diào)函數(shù)來獲取從父組件傳遞過來的 ref,并將其傳遞給內(nèi)部的某個特定元素或組件。這樣,在父組件中使用 ref 引用子組件時,實際上獲取到的是子組件內(nèi)部指定的元素或組件。
const MyComponent = React.forwardRef((props, ref) => ( <div ref={ref}> {/* 組件內(nèi)容 */} </div> ));
舉個例子
const ParentComponent = () => { const childRef = useRef(); useEffect(() => { console.log(childRef.current); // 子組件內(nèi)指定的元素或組件 }, []); return ( <div> <MyComponent ref={childRef} /> </div> ); };
memo
memo:memo 是用于優(yōu)化函數(shù)組件的渲染性能的高階函數(shù)。它可以包裹一個函數(shù)組件,并返回一個經(jīng)過優(yōu)化的組件。
memo 會對函數(shù)組件的輸入屬性進行淺比較,如果輸入屬性沒有發(fā)生變化,那么組件就不會重新渲染。只有當輸入屬性發(fā)生變化時,memo 才會重新調(diào)用函數(shù)組件進行渲染。
const MemoizedComponent = React.memo(MyComponent);
舉個例子
const MyComponent = ({ text }) => { // 組件邏輯 return <div>{text}</div>; }; const MemoizedComponent = React.memo(MyComponent); const ParentComponent = () => { const [text, setText] = useState('Hello'); useEffect(() => { setTimeout(() => { setText('Hello, World!'); }, 1000); }, []); return <MemoizedComponent text={text} />; };
適用場景
forwardRef 的適用場景
- 當你需要在父組件中直接操作子組件內(nèi)部的特定元素或組件時,可以使用 forwardRef 將 ref 傳遞到函數(shù)組件內(nèi)部的特定元素或組件中。
- 例如,如果你希望在父組件中調(diào)用子組件的方法、訪問子組件的某個 DOM 元素或組件實例等,就可以使用 forwardRef 來實現(xiàn)。
- 在這種情況下,forwardRef 可以提高代碼的可維護性和可讀性,使父組件更方便地控制子組件。
memo 的適用場景
- 當組件的輸入屬性沒有發(fā)生變化時不希望重新渲染組件時,可以使用 memo 進行組件的淺比較。
- = 通過避免不必要的重復渲染,memo 可以顯著提高組件的渲染性能,減少不必要的 DOM 操作,改善用戶體驗。
- memo 適用于純展示型組件或受控組件等,在這些組件中,輸入屬性的變化不會導致組件內(nèi)部狀態(tài)的改變,也不會引起副作用。
優(yōu)點缺點
forwardRef 的優(yōu)點:
提供了一種簡單的方式將 ref 傳遞給函數(shù)組件內(nèi)部的特定元素或組件。
可以讓父組件更方便地操作子組件內(nèi)部的特定元素或組件,提高了代碼的可維護性和可讀性。
forwardRef 的缺點:
增加了組件層級,可能會導致額外的性能開銷。
可能會破壞組件的封裝性,使組件與父組件之間產(chǎn)生緊密耦合。
memo 的優(yōu)點:
通過淺比較可以避免不必要的組件渲染,提高了組件的性能。
對于純展示型組件或受控組件等,可以有效減少不必要的 DOM 操作,改善用戶體驗。
memo 的缺點:
僅適用于基于輸入屬性的淺比較,如果組件的渲染依賴于其他因素(如上下文、狀態(tài)等),則可能無法發(fā)揮優(yōu)化作用。
使用 memo 進行淺比較會引入一定的計算開銷,對于簡單的組件可能不值得使用。
到此這篇關于react中的forwardRef 和memo的區(qū)別?的文章就介紹到這了,更多相關react中的forwardRef 和memo的區(qū)別?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
react清空ant.design中表單內(nèi)容的方法實現(xiàn)
本文主要介紹了react清空ant.design中表單內(nèi)容的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12React掌握openapi-typescript-codegen快速生成API客戶端代碼的過程
openapi-typescript-codegen是一個開源工具,用于根據(jù)OpenAPI規(guī)范自動生成TypeScript代碼,包括類型定義和API客戶端代碼,它幫助開發(fā)者節(jié)省手動編寫代碼的時間,提高開發(fā)效率,感興趣的朋友一起看看吧2024-11-11在React頁面重新加載時保留數(shù)據(jù)的實現(xiàn)方法總結
在React頁面重新加載時保留數(shù)據(jù),可以通過多種方法來實現(xiàn),常見的方法包括使用瀏覽器的本地存儲(Local Storage 或 Session Storage)、URL參數(shù)、以及服務器端存儲等,本文給大家總結了一些具體實現(xiàn)方法,需要的朋友可以參考下2024-06-06