React.memo はコンポーネントをラップし、その props が前回のレンダリングと浅い比較で等しいときに再レンダリングをスキップさせます。デフォルトでは、子は親が再レンダリングされるたびに再レンダリングされますが、memo は props が実際には変わっていない場合にそれを短絡します。
jsx
= .( () {
;
});
memo は浅い比較を行います。親が毎レンダリングで新しいオブジェクト・配列・関数を渡すと、比較は常に失敗し、memo は何の効果もありません:
function List({ items }) {
// ❌ a NEW function every render → Row's onSelect prop always "changes"
return items.map(i => <Row key={i.id} item={i} onSelect={id => pick(id)} />);
}
useCallback で関数を安定させることで対処します:
const onSelect = useCallback(id => pick(id), []); // same reference across renders
return items.map(i => <Row key={i.id} item={i} onSelect={onSelect} />);