React-Query란
- 서버 상태 관리를 위한 라이브러리
- 자체적 캐싱 기능이 존재 (Hooks 기반 라이브러리)
- 캐싱, get한 데이터 자동 updating 지원, 중복 호출 컨트롤 지원, 무한 스크롤, 쉬운 비동기 관리
React-Query의 라이프 사이클
1. Fetching:
2 Fresh:
즉, fetching -> fresh -> stale -> InActive -> delete 순서
리액트 쿼리 기본 사용 (리액트에서 가장 많이 사용되는 API)
const usersQuery = useQuery('users', fetchUsers)
const teamsQuery = useQuery('teams', fetchTeams)
const projectsQuery = useQuery('projects', fetchProjects)
만약, 이렇게 사용하면 다른 쿼리가 실행되기 전에 첫번째 쿼리가중단하고 에러를 반환할 수 있다.
const userQueries = useQueries(
users.map(user => {
return {
queryKey: ['user', user.id],
queryFn: () => fetchUserById(user.id),
}
})
)
하지만, useQueries는 useQuery옵션 객체를 배열로 받을 수 있다. 그와 동시에 결과값 또한, 배열로 return 한다.
//ReactQueryPost.ts
//(axios post 함수 따로 빼놓은거)
import axios from 'axios';
interface dataType {
title: string;
}
const ReactQueryPost = async (newPostData: dataType) => {
const { data } = await axios.post(
'https://dummyjson.com/products/add',
newPostData
);
return data;
};
export default ReactQueryPost;
ReactQueryPost로 들어오는 인자를 받아서 post데이터로 넣어준다.
//ReactQueryView.tsx
//Mutaion 데이터 변경
const mutationData = useMutation(ReactQueryPost);
// mutation 버튼 클릭 이벤트
const onBtnClick = () => {
mutationData.mutate(
{ title: '레오 폰' },
{
onSuccess: () => {
console.log('post 성공');
},
onError: () => {
console.log('post Error');
},
onSettled: () => {
console.log('post settled (성공이든 실패든 둘다 동작)');
},
}
);
// console.log('mutation' + mutationData.isSuccess);
};
useMutation은 이렇게 mutate함수 내부에서 onSuccess, onError, onSettled등 내부에서 수행이 가능하다.
{title: '레오폰'}이 객체가 ReactQueryPost내부 인자로 들어간다.
queryClient.invalidateQueries({
predicate: query => query.queryKey[0] === "todos" && query.queryKey[1]?.version >= 10,
});