원문 : https://cekrem.github.io/posts/beyond-react-memo-smarter-performance-optimization/
React.memo는 만능이 아니다React.memo는 props가 변경되지 않으면 컴포넌트 리렌더링을 막아주는 기능.useCallback, useMemo 등과 함께 관리해줘야 하므로 코드 복잡도가 높아질 수 있음.React.memo로 해결되지 않음.문제 코드:
const Button = React.memo(({ onClick }: { onClick: () => void }) => {
return <button onClick={onClick}>Click</button>;
});
function Parent() {
const [count, setCount] = useState(0);
const handleClick = () => {
console.log('clicked');
};
return (
<>
<div>{count}</div>
<Button onClick={handleClick} />
</>
);
}
개선 코드:
const Button = React.memo(({ onClick }: { onClick: () => void }) => {
return <button onClick={onClick}>Click</button>;
});
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log('clicked');
}, []);
return (
<>
<div>{count}</div>
<Button onClick={handleClick} />
</>
);
}
→ 하지만 궁극적으로는 구조적으로 리렌더링을 줄이는 게 더 효과적이다.
문제 코드:
function App() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Open Modal</button>
<Modal open={open} />
</>
);
}
개선 코드:
function App() {
return <ModalTrigger />;
}
function ModalTrigger() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Open Modal</button>
{open && <Modal />}
</>
);
}