현재 곳곳에서 사용되고있는 입력값 input을 바로바로 zustand 상태 변환을 통해서 사용하고있다. 하지만 이렇게 되면 너무 많은 리랜더링이 일어나고 해당 리랜더링으로 인해서 다른 컴포넌트들도 같이 랜더링이 되는 사이드이팩트도 발생하기 때문에 최소한 불필요한 랜더링은 줄이는 방법이 가장 좋다고 생각해서 리팩토링 결정을 했다.
그러면 두가지 를 합치면 ??
우선 디바운싱방법이 가장 적합하고 useRef를 사용해서 해당 리렌더링을 최소화 시키면 가장 좋은 방법이 될수있지 않을까 라는 생각을 하게되었다
import { useRef, useEffect } from 'react';
export function useDebouncedCallback<T extends (...args: any[]) => {
const callbackRef = useRef(callback);
const debounced = (...args: Parameters<T>) => {
argsRef.current = args;
if (timeoutRef.current) clearTimeout(timeoutRef.current);
timeoutRef.current = setTimeout(() => {
if (argsRef.current) callbackRef.current(...argsRef.current);
}, delay);
};
const flush = () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
if (argsRef.current) {
callbackRef.current(...argsRef.current);
}
}
};
}
만약 디바운싱 시간차에 다른 이벤트로 인해서 값이 제대로 전달되지않을때 flush 함수는 해당 입력이 디바운싱시간을 거치지않고 넘어갈때 사용한다 남아있는 값들을 바꾸고 cleartimeout 진행시킨다
설명이 멋있고 사장님이 자세하네요