React - Hooks: useMemo, useCallback

BigbrotherShin·2020년 2월 4일
0

ZeroCho님의 React 유튜브강의를 보고 내용을 정리한 포스트입니다.

1. useMemo

첫 번째 인수로 전달된 함수의 return 값을 기억(리렌더링 하지 않음)
(두 번째 인수로 전달된 의존성이 변경되기 전까지 기억)

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

메모이제이션된 을 반환합니다.

“생성(create)” 함수와 그것의 의존성 값의 배열을 전달하세요. useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산 할 것입니다. 이 최적화는 모든 렌더링 시의 고비용 계산을 방지하게 해 줍니다.

useMemo로 전달된 함수는 렌더링 중에 실행된다는 것을 기억하세요. 통상적으로 렌더링 중에는 하지 않는 것을 이 함수 내에서 하지 마세요. 예를 들어, 사이드 이펙트(side effects)는 useEffect에서 하는 일이지 useMemo에서 하는 일이 아닙니다.

배열이 없는 경우 매 렌더링 때마다 새 값을 계산하게 될 것입니다.

useMemo는 성능 최적화를 위해 사용할 수는 있지만 의미상으로 보장이 있다고 생각하지는 마세요.

주의
의존성 값의 배열은 함수에 인자로 전달되지는 않습니다. 그렇지만 개념적으로는, 이 기법은 함수가 무엇일지를 표현하는 방법입니다. 함수 안에서 참조되는 모든 값은 의존성 값의 배열에 나타나야 합니다. 나중에는 충분히 발전된 컴파일러가 이 배열을 자동으로 생성할 수 있을 것입니다.

참고: Hooks API Reference – React

2. useCallback

첫 번째 인수로 전달된 함수를 기억(리렌더링 하지 않음)
(두 번째 인수로 전달된 의존성이 변경되기 전까지)

const Component = () => {
  const memoizedCallback = useCallback( // 컴포넌트에 작성하는 함수
  () => {
    doSomething(a, b);
  }, [a, b]);
  
  return (
    <button onClick={memorizedCallback} />;
  );
};

메모이제이션된 콜백을 반환합니다.

tip: 컴포넌트에 작성하는 함수들은 useCallback으로 감싸야 합니다.

인라인 콜백과 그것의 의존성 값의 배열을 전달하세요. useCallback은 콜백의 메모이제이션된 버전을 반환할 것입니다. 그 메모이제이션된 버전은 콜백의 의존성이 변경되었을 때에만 변경됩니다. 이것은, 불필요한 렌더링을 방지하기 위해 (예로 shouldComponentUpdate를 사용하여) 참조의 동일성에 의존적인 최적화된 자식 컴포넌트에 콜백을 전달할 때 유용합니다.

useCallback(fn, deps)은 useMemo(() => fn, deps)와 같습니다.

주의
의존성 값의 배열이 콜백에 인자로 전달되지는 않습니다. 그렇지만 개념적으로는, 이 기법은 콜백 함수가 무엇일지를 표현하는 방법입니다. 콜백 안에서 참조되는 모든 값은 의존성 값의 배열에 나타나야 합니다.

참고: Hooks API Reference – React

profile
JavaScript, Node.js 그리고 React를 배우는

0개의 댓글