React

[React] Hooks - useCallback + useMemo

wwxs 2024. 9. 6. 17:15

useCallback

  • 특정 콜백함수가 의존성 배열에 명시된 값들이 변경되지 않는 한 동일한 함수 인스턴스를 유지하도록 해주는 훅
  • 주로 자식 컴포넌트에 함수를 전달할 때 사용
더보기
//# 자식 컴포넌트
const Button = React.memo(({handleClick} : {handleClick: () => void}) => {
  console.log(`버튼이 렌더링 되었습니다.`);
  return <button onClick={handleClick}>클릭</button>
});

//# 부모 컴포넌트
export default function UseCallback() {
  const [count, setCount] = useState<number>(0);
  const [text, setText] = useState<string>("");

  // 부모 컴포넌트에서 정의한 이벤트 핸들러
  // : useCallback을 사용하여 함수의 동일한 인스턴스를 유지

  // >> 2개의 인수 전달
  // 첫 번째 인수: 콜백 함수
  // 두 번째 인수: 새로운 함수를 등록하기 위한 의존성 배열
  const handleCountClick = useCallback(() => {
    setCount(prevCount => prevCount + 1);
  }, [count]);

  return (
    <div>
      <h3>useCallback</h3>
      <p>Count: {count}</p>
      <Button handleClick={handleCountClick} />
      <p>
        <input type="text" value={text} onChange={(e) => setText(e.target.value)} />
      </p>
    </div>
  )
}

 

useMemo

  • use + Memoization(메모리화)
  • 성능 최적화를 위한 Hook
  • 컴포넌트가 렌더링될 때 특정 연산의 결과를 메모리에 저장하여 동인한 값에 대해서는 해당 연산을 다시 수행하지 않도록 하는 훅
더보기
export default function UseMemo01() {
  const [count, setCount] = useState<number>(0);
  const [inputValue, setInputValue] = useState<string>("");

  // 복잡한 계산 함수 (시간이 오래 걸리는 작업)

  const expensiveCalc = (num: number) => {
    for (let i = 0; i < 999999999; i++){}
    return num + 100;
  }

  // const result = expensiveCalc(count)

  //! useMomo()훅의 경우 메모리에 저장된 값을 반환
  // >> 내부의 구조는 useEffect와 동일 (콜백함수, 의존성배열)
  const memoizedResult = useMemo(() => {
    const result = expensiveCalc(count);
    return result
    // 배열 안의(의존성 배열, deps)의 값이 변경될 때만 재계산
  }, [count]);

  return (
    <div>
      <h3>useMemo</h3>
      <p>Count: {count}</p>
      <p>Result(Count + 100): {memoizedResult}</p>
      <button
        onClick={() => {
          setCount((prevCount) => prevCount + 1);
        }}
      >
        증가
      </button>
      <p>
        <input
          type="text"
          value={inputValue}
          placeholder="입력해주세요"
          onChange={(e) => setInputValue(e.target.value)}
        />
      </p>
    </div>
  );
}

 

컴포넌트 자체를 메모화 하는 경우

  • React.memo()
  • 함수형 컴포넌트에서 props의 값이 동일한 경우
  • 이전의 렌더링 결과를 재사용하여 불필요한 리렌더링을 방지
더보기
//# 자식 컴포넌트
const ChildComponent = React.memo(({ count }: { count: number }) => {
  console.log("자식 컴포넌트 렌더링");
  return <div>Count: {count}</div>;
});

//# 부모 컴포넌트
function UseMemo02() {
  const [count, setCount] = useState<number>(0);
  const [text, setText] = useState<string>("");

  return (
    <div>
      <h3>React.memo 예시</h3>
      <ChildComponent count={count} />
      <button onClick={() => setCount(count + 1)}>증가</button>

      <input
        type="text"
        value={text}
        onChange={(e) => setText(e.target.value)}
      />
    </div>
  );
}

// 컴포넌트를 메모이제이션하고 export default로 내보내기
export default React.memo(UseMemo02);

'React' 카테고리의 다른 글

[React] Hooks - customHook  (0) 2024.09.06
[React] Hooks - useReducer  (0) 2024.09.06
[React] Hooks - useEffect  (0) 2024.08.31
[React] Hooks - useRef  (0) 2024.08.31
[React] Hooks - useState  (0) 2024.08.31