Debounced 및 Typesafe React Query with Hooks
10776 단어 reactreactqueryaxiostypescript
대답은 API에 대한 가져오기 호출을 디바운싱하여 사용자에게 입력을 중지할 시간을 주는 것입니다. 나는 React Query를 사용하여 이 문제에 대한 많은 솔루션을 찾았고, 내가 찾고 있던 원하는 "디바운스된 쿼리"결과를 달성하기 위해 함께 잘 작동하는 몇 가지 후크를 함께 모았습니다.
설정
따라하려면 다음 패키지가 필요합니다(프로젝트에서 이미 새로운 버전의 React를 사용하고 있다고 가정).
react-query
axios
typescript
후크
후크용 파일 2개를 만듭니다.
useDebounce.ts
이 파일은 상태 업데이트 시 시간 초과 지연을 설정하는 사용자 정의 후크를 생성합니다(이 경우 사용자 입력 대기). 시간 초과가 존재하면 시간 초과도 지워집니다.
import React from "react";
export default function useDebounce(value: string, delay: number = 500) {
const [debouncedValue, setDebouncedValue] = React.useState(value);
React.useEffect(() => {
const handler: NodeJS.Timeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Cancel the timeout if value changes (also on delay change or unmount)
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
useReactQuery.ts
이 파일은 쿼리 인수를 수락하고 React Query
useQuery
후크를 반환하고 axios.get()
를 래핑하여 getStuff
함수의 데이터로 Promise를 반환하는 사용자 정의 후크를 생성합니다.import { useQuery } from "react-query";
import axios from "axios";
export type QueryResponse = {
[key: string]: string
};
const getStuff = async (
key: string,
searchQuery: string,
page: number
): Promise<QueryResponse> => {
const { data } = await axios.get(
`https://fetchurl.com?query=${query}&page=${page}`
);
return data;
};
export default function useReactQuery(searchQuery: string, page: number) {
return useQuery<QueryResponse, Error>(["query", searchQuery, page], getStuff, {
enabled: searchQuery, // If we have searchQuery, then enable the query on render
});
}
소비
컨테이너.tsx
기본적으로 그게 다야! 이제 우리가 해야 할 일은 컨테이너 구성 요소로 이동하여 후크를 작동시키는 것입니다!
searchQuery
를 디바운스 후크에 전달하고 디바운스 결과를 React 쿼리 후크에 전달하고 데이터 변경 또는 가져오기 상태에 응답합니다. React Query 개발 도구를 활성화하고 결과 쿼리가 실시간으로 실행되는 것을 볼 수 있습니다(매우 훌륭합니다!).// import { ReactQueryDevtools } from "react-query-devtools";
import useDebounce from "../../hooks/useDebounce";
import useReactQuery from "../../hooks/useReactQuery";
export type ContainerProps = {
searchQuery: string;
isFetchingCallback: (key: boolean) => void;
};
export const Container = ({
searchQuery,
isFetchingCallback,
}: Readonly<ContainerProps>): JSX.Element => {
const debouncedSearchQuery = useDebounce(searchQuery, 600);
const { status, data, error, isFetching } = useReactQuery(
debouncedSearchQuery,
page
);
React.useEffect(() => isFetchingCallback(isFetching), [
isFetching,
isFetchingCallback,
]);
return (
<>
{data}
{/* <ReactQueryDevtools /> */}
</>
);
};
Reference
이 문제에 관하여(Debounced 및 Typesafe React Query with Hooks), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/arnonate/debouncing-react-query-with-hooks-2ek6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)