초보 개발자의 일기
React-Query 시작하기 본문
728x90
React-query 시작
React Query는 비동기 서버 상태 관리 라이브러리이다.
React Query는 서버의 값을 클라이언트에 가져오거나, 캐싱, 값 업데이트, 에러핸들링 등 비동기 과정을 더욱 편하게 하는 데 사용된다.
사용이유
react-query를 사용함으로 서버, 클라이언트 데이터를 분리합니다. 이 개념에 대해 동의 하지 않아도 아래의 장점을 보신다면 사용하고 싶은 생각이 드실 것입니다.
장점
- 캐싱
- get을 한 데이터에 대해 update를 하면 자동으로 get을 다시 수행한다. (예를 들면 게시판의 글을 가져왔을 때 게시판의 글을 생성하면 게시판 글을 get 하는 api를 자동으로 실행 )
- 데이터가 오래 되었다고 판단되면 다시 get (invalidateQueries)
- 동일 데이터 여러번 요청하면 한 번만 요청한다. (옵션에 따라 중복 호출 허용 시간 조절 가능)
- 무한 스크롤 (infinite scroll)
- 비동기 과정을 선언적으로 관리할 수 있다.
- react hook과 사용하는 구조가 비슷하다.
시작하기
const queryClient = new new QueryClient();
export function App(): ReactElement {
return (
<QueryClientProvider client={queryClient}>
<pages />
<ReactQueryDevtools />
</QueryClientProvider>
);
}
useQuery
- 데이터를 get 하기 위해 사용하는 hook
- post와 update를 하기 위해서는 useMutation사용
- useQuery의 첫번째 파라미터 값으로는 QueryKey, 두 번째 파라미터 값으로는 api 호출 함수( 비동기 함수)가 들어간다.
- useQuery는 비동기로 작동한다. 즉, 한 컴포넌트에 여러개의 useQuery가 있다면 하나가 끝나고 다음 useQuery가 실행되는 것이 아닌 두 개의 useQuery가 동시에 실행됩니다.
- 여러 개의 비동기 query가 있다면 useQuery보다는 useQueries를 사용해야 한다.
const { isLoading, isError, data : fnData, error } = useQuery("fn1", fetchfn, {
//옵션 자리 ex) staleTime, cacheTime ...
,
onSuccess: data => {
// 성공시 호출
console.log(data);
},
onError: e => {
// 실패시 호출 (401, 404 같은 error가 아니라 정말 api 호출이 실패한 경우만 호출)
// 강제로 에러 발생시키려면 api단에서 throw Error 날립니다.
console.log(e.message);
}
});
if (isLoading) {
return <span>Loading...</span>;
}
if (isError) {
return <span>Error: {error.message}</span>;
}
useMatation
값을 바꿀때 사용하는 hook이다.
return 값은 useQuery와 동일하다.
import { useState, useContext, useEffect } from "react";
import loginApi from "api";
import { useMutation } from "react-query";
const Index = () => {
const [id, setId] = useState("");
const [password, setPassword] = useState("");
const loginMutation = useMutation(loginApi, {
onMutate: variable => {
console.log("onMutate", variable);
// variable : {loginId: 'xxx', password; 'xxx'}
},
onError: (error, variable, context) => {
// error
},
onSuccess: (data, variables, context) => {
console.log("success", data, variables, context);
},
onSettled: () => {
console.log("end");
}
});
const handleSubmit = () => {
loginMutation.mutate({ loginId: id, password });
};
return (
<div>
{loginMutation.isSuccess ? "success" : "pending"}
{loginMutation.isError ? "error" : "pending"}
<input type="text" value={id} onChange={e => setId(e.target.value)} />
<input
type="password"
value={password}
onChange={e => setPassword(e.target.value)}
/>
<button onClick={handleSubmit}>로그인</button>
</div>
);
};
export default Index;
출처
728x90
'Frontend practice > React-Query' 카테고리의 다른 글
Re-fetch (0) | 2023.04.10 |
---|