Open hyeonseong2023 opened 3 days ago
useQuery 훅 사용 예제
import { useQuery } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
function TodoList() {
const { isLoading, error, data } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
staleTime: 5 * 60 * 1000, // 5분
})
if (isLoading) return <div>로딩 중...</div>
if (error) return <div>에러 발생: {error.message}</div>
return (
<ul>
{data.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
// 데이터 페칭 함수
const fetchTodos = async () => {
const response = await fetch('https://api.example.com/todos')
if (!response.ok) {
throw new Error('네트워크 응답이 올바르지 않습니다')
}
return response.json()
}
React-Query는 React 애플리케이션에서 데이터 가져오기, 캐싱, 동기화 등 다양한 데이터 관리 문제를 해결하기 위한 강력한 라이브러리
데이터 가져오기 추상화:
자동 캐싱 및 상태 관리:
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
{/* 애플리케이션 내용 */}
</QueryClientProvider>
);
}
function UserList() {
//useInfiniteQuery = 페이지 정보를 관리할 수 있는 훅
//React-Query의 주요 훅 중 하나로,
//무한 스크롤이나 페이지네이션과 같은 데이터 페칭 기능을 쉽게 구현
const { data, error, isLoading, isFetching, fetchNextPage, hasNextPage } =
//users = 데이터를 식별하는 쿼리키
useInfiniteQuery("users", fetchUsers, {
//getNextPageParam = 다음 페이지의 커서 정보를 반환하는 함수
getNextPageParam: (lastPage, pages) => lastPage.nextCursor,
});
//isLoading 상태가 true이면 "Loading..."을 렌더링
if (isLoading) return <div>Loading...</div>;
//error 객체가 있으면 에러 메시지를 렌더링
if (error) return <div>Error: {error.message}</div>;
return (
<div>
<ul>
//모든 페이지의 결과를 평면화하여 하나의 평면 배열로 변경 // map()을
사용하여 렌더링
{data?.pages.flatMap((page) =>
page.results.map((user) => (
<li key={user.id}>
{user.name} - {user.email}
</li>
))
)}
</ul>
//hasNextPage가 true이면 사용자에게 "Load More" 버튼 표출
{hasNextPage && (
<button onClick={() => fetchNextPage()} disabled={isFetching}>
//true이면 사용자에게 "Loading..." 메시지 표출
{isFetching ? "Loading more..." : "Load More"}
</button>
)}
</div>
);
}
//현재 페이지 정보(커서)를 받아 다음 페이지의 데이터를 가져오는 함수.
//최초 호출 시에는 pageParam이 0
//이후 호출 시에는 이전 페이지의 nextCursor 값이 pageParam으로 전달.
async function fetchUsers({ pageParam = 0 }) {
const response = await fetch(`/api/users?cursor=${pageParam}`);
const data = await response.json();
return { results: data.users, nextCursor: data.nextCursor };
}
📝 p247
❓ React-Query에 대해 설명해주세요 책의 중간 중간 React-Query가 등장하는데, (1)React-Query의 사용 이유와 (2)앞 사람과의 중복 없이 장점 하나를 예시 코드와 함께 설명해주세요!