웹 서비스를 요청하고, 응답받은 데이터를 관리하는데 도움이 되는 라이브러리이다.
React Query가 실제로 서비스 요청을 하는 것은 아니다.(이 부분은 여전히.. fetch나 axios와 같은 라이브러리를 사용해야 한다.)
React Query를 사용하면 컴포넌트 라이프 사이클에 맞춰 적절한 타이밍에 서비스 요청을 지시할 수 있다. 또, 요청 응답 데이터를 상태(state)로 설정하거나 서비스 요청을 위한 상태 변수를 지정 할 수 도 있다.
클라이언트 사이드 상태는 사용자의 브라우저 내에서 관리되는 상태이다. 리액트 컴포넌트의 useState
또는 상태 관리 라이브러리(ex. Redux, MobX, Recoil)를 통해 관리된다.
서버 사이드 상태는 서버에 저장되고 관리되는 데이터를 말한다. 이는 데이터베이스, 파일 시스템, 서버의 메모리 등에 저장될 수 있다.
npm install react-query
yarn add react-query
TyepScript사용을 위한 Type을 포함하고 있으므로 별도의 패키지 설치는 필요가 없다.
데이터를 읽어오는 기능(QueryClient)을 어플리케이션 전체에 주입하도록 하는 API
참고로 react-query에서 devtools를 지원한다.
import { QueryClient, QueryClientProvider } from "react-query";
export default function App() {
const queryClient = new QueryClient();
return (
<QueryClientProvider client={queryClient}>
<ReactQueryDevtools initialIsOpen={true} />
<App />
</QueryClientProvider>
);
}
import { useQuery } from "react-query";
import { getTodos } from "../api/todos";
function App() {
const { isLoading, isError, data } = useQuery("todos", getTodos, {
staleTime: Infinity,
});
if (isLoading) {
return <div>로딩중...</div>;
}
if (isError) {
return <p>오류가 발생하였습니다...!</p>;
}
return (
<ul>
{data
?.filter((todo: TodoType) => {
return todo.isDone === isDone;
})
.map((todo: TodoType) => {
return (
~~~
);
})}
</ul>
}
query와 다르게 mutation은 CUD에서 사용된다.
import { useMutation, useQueryClient } from "react-query";
import { deleteTodo, patchTodo } from "../api/todos";
function App() {
const queryClient = useQueryClient();
// update mutation~~
const { mutate: updateMutate } = useMutation("todos", patchTodo, {
onSuccess: () => {
queryClient.invalidateQueries("todos");
},
});
// delete mutation~~
const { mutate: deleteMutate } = useMutation("todos", deleteTodo, {
onSuccess: () => {
queryClient.invalidateQueries("todos");
},
});
const isDoneBtn = (todo: TodoType) => {
updateMutate(todo);
};
const deletBtn = (id: number) => {
deleteMutate(id);
};
return (
<ul>
{data
?.filter((todo: TodoType) => {
return todo.isDone === isDone;
})
.map((todo: TodoType) => {
return (
~~~
);
})}
</ul>
}
isldle
isLoding
isError
error 객체를 항상 품고 있음을 명심해야 한다.
isSuccess(query에만 있는게 아니다)
data 객체를 항상 품고 있을을 명심해야 한다.