packagesreacthooksusePreserveCallback

usePreserveCallback

useCallback을 사용하지 않은 콜백 함수라도 레퍼런스를 보존하여 불필요한 렌더링을 방지하는 Hook입니다.

Props

이름타입설명
callback(...args: any[]) => any보존할 콜백 함수

Return

  • 레퍼런스가 보존된 콜백 함수

Usage

import { usePreserveCallback } from '@teamsparta/react';
 
function Example({ onSomeEvent }: { onSomeEvent: () => void }) {
  const preservedCallback = usePreserveCallback(onSomeEvent);
 
  useEffect(() => {
    preservedCallback();
  }, [preservedCallback]); // 콜백의 레퍼런스가 변경되어도 불필요한 리렌더링 방지
 
  return <div>예제 컴포넌트</div>;
}

Example

이벤트 핸들러 최적화

function EventHandler({ onChange }: { onChange: (value: string) => void }) {
  const handleChange = usePreserveCallback(onChange);
 
  useEffect(() => {
    const listener = (event: Event) => {
      handleChange(event.target.value);
    };
 
    element.addEventListener('change', listener);
    return () => element.removeEventListener('change', listener);
  }, [handleChange]); // onChange가 변경되어도 불필요한 이벤트 리스너 재등록 방지
 
  return <div>이벤트 핸들러 예제</div>;
}

타이머 콜백 최적화

function Timer({ onTick }: { onTick: () => void }) {
  const preservedOnTick = usePreserveCallback(onTick);
 
  useEffect(() => {
    const intervalId = setInterval(() => {
      preservedOnTick();
    }, 1000);
 
    return () => clearInterval(intervalId);
  }, [preservedOnTick]); // onTick이 변경되어도 타이머는 유지
 
  return <div>타이머 예제</div>;
}

주의사항

  • 이 Hook은 콜백 함수의 레퍼런스는 보존하면서도 항상 최신 상태의 콜백을 실행합니다.
  • useCallback과 달리 의존성 배열이 필요하지 않습니다.
  • 성능 최적화가 필요한 경우에만 사용하는 것을 권장합니다.