728x90
반응형
input창에 검색어를 입력할 때마다 API가 호출되지 않고, 특정 기준(ms)동안 입력이 되지 않았을 때 입력된 값으로 API를 호출하도록 해줬다.
왜냐하면 유료 API를 사용했을 때, 입력마다 API가 호출되는 것이 큰 문제가 될 수 있기 때문이다.
예를 들어, 구글지도 API와 같은 것을 사용할 때 입력할 때마다 쿼리를 날리면 엄청난 손해이다. 쿼리 하나하나가 모두 돈이기 때문이다.
debouncing
useDebounce라는 훅을 만들어서 사용을 했는데, 먼저 debouncing이 뭔지에 대해 알아보자.
debouncing은 연이어 호출되는 함수들 중 마지막 함수(또는 제일 처음)만 호출되도록 하는 것이다.
디바운싱은 앞에서 언급했던 상황처럼 검색에 자주 사용된다.
코드 구현
1. useDebounce custom hook을 생성하여 검색어에 debounce를 적용
import { useEffect, useState } from 'react';
const useDebounce = (value: string, delay: number) => {
const [debouncedValue, setDebouncedValue] = useState<string>(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
};
export default useDebounce;
2. 사용자가 검색어 입력을 시작한 후 500ms동안 입력이 없으면 API가 호출되도록 구현
const debouncedValue = useDebounce(inputValue, 500);
const [suggestedList, setSuggestedList] = useState<SuggestedListState>([]);
useEffect(() => {
const fetchApi = async () => {
// fetch 코드 있다고 가정
console.info('calling api');
};
if (!debouncedValue) {
setSuggestedList([]);
} else fetchApi();
}, [inputValue, debouncedValue]);
debounceValue가 있을 때만 fetchApi를 호출하도록 해줬다.
참고자료
질문이나 잘못된 점은 댓글로 남겨주세요 :)💖
728x90
반응형
'React' 카테고리의 다른 글
react-query의 useQuery 언제 사용할까? (2) | 2023.07.12 |
---|---|
[React + TS] 무한스크롤 구현하기 (0) | 2023.05.23 |
React 렌더링과 최적화 + React.memo로 재사용여부 판단하기 (0) | 2023.05.07 |
[react] useId Hook + 예제 (0) | 2023.04.27 |
[react] useCallback Hook + 예제 (0) | 2023.04.27 |
댓글