useQuery์์ ์ฐจ์ด์
1. ๋ฐํ ๊ฐ์ฒด์์ ๋ฐํ๋๋ ๋ฐ์ดํฐ ์์ฑ์ ๊ตฌ์กฐ์ ํํ (pages, pageParams)
useQuery๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ํจ์์์ ๋ฐ์ดํฐ๊ฐ data ์์ฑ์ ๋ด๊ฒจ ๋ฐํ๋์ง๋ง, useInfiniteQuery ์์๋ ๋ฐํ๋๋ ๊ฐ์ฒด๊ฐ data์ pages๋ผ๋ ๋ ๊ฐ์ง ์์ฑ์ ํฌํจํ๋ค. pages๋ ๊ฐ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด๋ค. ๋ฐ๋ผ์ pages ๋ฐฐ์ด์ ๊ฐ ์์๋ useQuery๋ฅผ ์ฌ์ฉํ์ ๋ ๊ฐ๊ฐ์ ์ฟผ๋ฆฌ์์ ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ์ ํด๋นํ๋ค.
pageParams (ํ์ด์ง ๋งค๊ฐ๋ณ์)๋ ์๋๋ฐ, ์ด๋ ๊ฐ ํ์ด์ง๋ง๋ ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋กํ๋ค. (์ ์ฌ์ฉ๋์ง๋ ์๋๋ค.)
๊ทธ๋์ ๊ฐ ์ฟผ๋ฆฌ๋ pages ๋ฐฐ์ด์ ์์ ๋ง์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ทธ ์์๋ ํด๋น ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ธ๋ค.
์ฟผ๋ฆฌ๋ ํ์ด์ง๋ฅผ ์งํํจ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ณ , ํ์ด์ง ๋งค๊ฐ๋ณ์๋ ๊ฒ์๋ ์ฟผ๋ฆฌ์ ํค๋ฅผ ์ถ์ ํ๋ค.
2. syntax
useInfiniteQuery ์ต์ ์ค getNextPageParam: (lastPage, allPages) => ๋ง์ง๋ง ํ์ด์ง ๋ฐ์ดํฐ๋ ๋ชจ๋ ํ์ด์ง์ ๋ฐ์ดํฐ์์ ๋ค์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ํจ์
* useInfiniteQuery์ return object properties
fetchNextPage => ์ฌ์ฉ์๊ฐ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋๋ง๋ค ํธ์ถํ๊ณ ์ถ์ ํจ์
hasNextPage => ๋ค์ ํ์ด์ง๊ฐ ์๋์ง
isFetchingNextPage => ๋ค์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์ธ์ง ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์ธ์ง๋ฅผ ๊ตฌ๋ณํ ์ ์๋ค.
์ฐธ๊ณ )
https://tanstack.com/query/latest/docs/framework/react/reference/useInfiniteQuery
import InfiniteScroll from "react-infinite-scroller";
import { Species } from "./Species";
import { useInfiniteQuery } from "@tanstack/react-query";
const initialUrl = "https://swapi...";
const fetchUrl = async (url) => {
const response = await fetch(url);
return response.json();
};
export function InfiniteSpecies() {
const {
data,
fetchNextPage,
hasNextPage,
isLoading,
isError,
error,
isFetching,
} = useInfiniteQuery({
queryKey: ["sw-species"],
queryFn: ({ pageParam = initialUrl }) => fetchUrl(pageParam),
getNextPageParam: (lastPage) => lastPage.next || undefined,
});
if (isLoading) return <div className='loading'>Loading...</div>;
if (isError) return <div>{error.toString()}</div>;
return (
<>
{isFetching && <div className='loading'>Loading...</div>}
<InfiniteScroll
pageStart={0}
loadMore={() => {
if (!isFetching) {
fetchNextPage();
}
}}
hasMore={hasNextPage}
loader={
<div className='loader' key={0}>
Loading ...
</div>
}
>
{data.pages.map((page, index) => (
<ul key={index}>
{page.results.map((species) => (
<Species
key={species.name}
name={species.name}
language={species.language}
averageLifespan={species.average_lifespan}
/>
))}
</ul>
))}
</InfiniteScroll>
</>
);
}
'๐ฅFrontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
tanstack query ํ์ด์ง๋ค์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ ํ๊ธฐ, prefetching (0) | 2025.01.01 |
---|---|
tanstak query์ staleTime๊ณผ gcTime ์ฐจ์ด (0) | 2024.12.30 |
tanstack query์ isFetching๊ณผ isLoading ์ฐจ์ด, React Query Dev Tools (0) | 2024.12.29 |
๋ฆฌ์กํธ ์ข์ ์ฝ๋ (๋ฆฌํฉํ ๋ง ํ ๋ ์ฐธ๊ณ ํ๊ธฐ) (0) | 2024.06.05 |
docusaurus์์ ์ต์ ๋ธ๋ก๊ทธ ๊ธ ๊ฐ์ ธ์ค๊ธฐ (0) | 2023.04.05 |