React.memo는 컴포넌트를 감싸서 props가 이전 render와 얕게 동일(shallow-equal)할 때 re-render를 건너뛰도록 합니다. 기본적으로 자식은 부모가 render될 때마다 re-render되지만, memo는 props가 실제로 변경되지 않았을 때 이를 차단합니다.
jsx
= .( () {
;
});
memo는 얕은(shallow) 비교를 합니다. 부모가 매 render마다 새 객체/배열/함수를 전달하면 비교는 항상 실패하고 memo는 아무것도 하지 못합니다:
function List({ items }) {
// ❌ 매 render마다 NEW 함수 → Row의 onSelect prop이 항상 "변경됨"
return items.map(i => <Row key={i.id} item={i} onSelect={id => pick(id)} />);
}
useCallback으로 함수를 안정화하여 해결하세요:
const onSelect = useCallback(id => pick(id), []); // render 사이에 동일한 참조
return items.map(i => <Row key={i.id} item={i} onSelect={onSelect} />);