파피루스

[React] Hook : useCallback, useMemo 본문

React

[React] Hook : useCallback, useMemo

떼굴펜 2024. 5. 20. 21:12

불필요한 렌더링을 줄이기 위해 사용하는 방법들

- React.memo : 컴포넌트 캐싱

- useCallback : 함수캐싱

- useMemo : 값 캐싱

 

React.memo

function Box () {
     return <div>박스</div>;
}
export default React.memo(Box);

 

 

❗함수도 function도 참조형 변수이기에, 만약 아래 예시와 같이 함수를 props로 전달하게 된다면 Parent가 리렌더링될 때 React.memo로 지정한 Box 컴포넌트도 리렌더링이 된다.

-> useCallback을 사용하면 렌더링하지 하지 않도록 변경할 수 있다.

function Parent () {
     const [count, setCount] = useState(5);
     const initCount = () => setCount(0);
     return <div><Box initCount={initCount}/></div>;
}
function Box ({ initCount }) {
     return <div><button onClick={() => initCount()}>초기화</button></div>;
}
export default React.memo(Box);

 

 

 

useCallback

const cachedFn = useCallback(fn, dependencies)
    - fn : 캐싱할 함수
    - dependencies : 값이 변경되면 경우, 반응할 값들의 목록
function Parent () {
     const [count, setCount] = useState(5);
     const initCount =useCallback(() => setCount(0), []);
     return <div><Box initCount={initCount}/></div>;
}
function Box ({ initCount }) {
     return  <div><button onClick={() => initCount()}>초기화</button> </div>;
}
export default React.memo(Box);

 

useMemo

: 재렌더링 사이에 계산 결과를 캐싱하기 위해 사용한다. (공식 문서)

const cachedValue = useMemo(calculateValue, dependencies);
    - calculateValue : 캐싱하려는 값을 계산하는 함수. 순수해야 하며 인자를 받지 않고, 모든 타입의 값을 반환할 수 있어야 한다.
    - dependencies : 변경되는 걸 감지할 값들의 목록
const value = useMemo( () => heavyWork(), [] );