你有沒有遇過這種情況:父元件更新後,明明子元件的 props 沒有改變,卻還是跟著重新渲染?
這時候,React.memo
就派上用場了。
React.memo
是一個 高階元件 (HOC),它會「記住上一次的渲染結果」。
它的運作方式就像 Class Component 的 PureComponent
,但專門給 Function Component 用。
function Child({ name }) {
console.log("Child render");
return <div>{name}</div>;
}
function App() {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(count + 1)}>+1</button>
<Child name="Andy" />
</>
);
}
App
重新渲染,Child
也會重新渲染。name="Andy"
沒有改變。const Child = React.memo(function Child({ name }) {
console.log("Child render");
return <div>{name}</div>;
});
App
重新渲染時,如果 Child
的 name
沒變,React 就直接跳過它。不是自動效能提升
物件 / 陣列 / 函式 props 問題
useMemo
/ useCallback
固定 reference。Context 更新照樣會觸發
useContext
的元件,即使有 memo,Context 改變仍會 re-render。👉 判斷以下 Child
會不會 re-render:
const Child = React.memo(({ data }) => {
return <div>{data.value}</div>;
});
function App() {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(count + 1)}>+1</button>
<Child data={{ value: 1 }} />
</>
);
}
答案:會 re-render,因為 { value: 1 }
每次 render 都是新的物件 reference。
React.memo 是一個 HOC,用來避免不必要的 re-render。它會記住上一次的結果,如果 props 沒改變,就跳過渲染。預設是做淺比較,傳物件或函式要搭配 useMemo
/ useCallback
才能穩定。
React.memo
:跳過 props 沒變的子元件 render。