왜 리액트 쿼리인가?
- 기존의 리덕스는 코드량이 많고, 비동기 데이터 관리를 위한 전문 라이브러리가 아님
중요한 3가지 포인트
Query : 데이터에 대한 요청 (R)
Mutation : 데이터 변경 (CUD)
Query Invalidation : 무효화(최신화)
사용방법
기본 세팅
import React from "react";
import Router from "./shared/Router";
import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient();
const App = () => {
return (
// QueryClientProvider : 데이터를 읽어오는 기능(QueryClient)을 애플리케이션 전체에 주입하도록 하는 API
<QueryClientProvider client={queryClient}>
<Router />;
</QueryClientProvider>
);
};
export default App;
useQuery
// src/api/todos.js
const getTodos = async () => {
const response = await axios.get(`${SERVER_URI}/todos`);
// 조회 기능에서는 return을 꼭 해줘야 한다!
return response.data;
};
export { getTodos };
// 조회가 필요한 곳에서
const { isLoading, isError, data } = useQuery("todos", getTodos);
useMutation
// src/api/todos.js
const addTodo = async (newTodo) => {
await axios.post(`${SERVER_URI}/todos`, newTodo);
};
export { addTodo };
// 변경이 필요한 곳에서
const queryClient = new QueryClient();
const getMutation = useMutation(addTodo, {
onSuccess: () => {
// todos 쿼리키를 가진 값을 무효화 and refetch
queryClient.invalidateQueries('todos')
}
})
useQuery
- 첫 번째 인자 : 쿼리 키(Query Keys)
- refetching
- caching
- 애플리케이션 내에 쿼리를 공유할 때
- 두 번째 인자 : 쿼리 함수(Query Functions)
- promise 객체를 return
- promise 객체는 반드시 data를 resolve하거나 에러를 내야 한다
- useQuery의 결과물
- 객체(object)
- 조회 결과에 대한 모든 정보가 들어있고, 그 과정에 대한 정보도 들어있다
useMutation
- mutation.mutate(인자)
- 인자는 반드시 한 개의 변수 또는 객체여야 한다
- 결과를 객체(object)로 갖고 있다
- 결과물 객체의 상태
- isIdle (가동되지 않고 있다)
- isLoading
- isError (error 객체를 가지고 있다)
- isSuccess (data 객체를 가지고 있다)
'항해 > TIL' 카테고리의 다른 글
TIL(3/2) / CSR, SSR (0) | 2024.03.02 |
---|---|
TIL(2/29) / lv3 (0) | 2024.02.29 |
TIL(2/27) / thunk (0) | 2024.02.27 |
TIL(2/26) / Redux Toolkit(Feat.Flux Pattern) (0) | 2024.02.26 |
TIL(2/23) / HTTP (0) | 2024.02.23 |