React-Query는 fetching, caching, synchronizing, and updating server state 등을 쉽게 만들어 주는 React 라이브러리이다.
useQuery()
Hook 사용import { useQuery } from '@tanstack/react-query'
function App() {
const info = useQuery({ queryKey: [**unique key**], queryFn: **비동기 함수** })
/* ↑ 같은 거 ↓ */
const info = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
}
isLoading or status
=== 'loading'
: 아직 데이터 없음isError or status
=== 'error'
: 오류 발생error
: 해당 property로 에러 메세지를 확인할 수 있음)isSuccess or status
=== 'success'
: 성공하여 데이터 사용 가능data
: 해당 property로 성공한 데이터를 확인할 수 있음)상위 컴포넌트에 import QueryClientProvider
, QueryClient
import { QueryClientProvider, QueryClient } from 'react-query';-
새로운 QueryClient
변수를 선언
const queryClient = new QueryClient();
queryClient
객체를 전역에서 사용할 수 있도록 QueryClientProvider
로 감싸줌
import { QueryClientProvider, QueryClient } from 'react-query';
const queryClient = new QueryClient();
export default function ParentCompnt() {
return (
/* 이 부분 */
<QueryClientProvider client={ queryClient }>
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/edit" element={<ChildrenCompnt />} />
</Routes>
</BrowserRouter>
</QueryClientProvider>
/* 이 부분 */
);
}
하위 컴포넌트에 import useQuery
import { useQuery } from "react-query";
Promise 기반 메서드 import
import { 메서드명 } from "메서드 경로";
useQuery
를 사용하여 unique key 설정
import { useQuery } from "react-query";
import { 메서드명 } from "메서드 경로";
export default function ChildrenCompnt() {
const [inputValue, setInputValue] = useState("");
/* 이 부분 */
const { data, isLoading } = useQuery('**unique key**', 메서드명)
/* 이 부분 */
if ( isLoading ) return <span>Loading...</span>
return (
<>
<h3>Hello World</h3>
</>
);
}
useMutation()
Hook 사용import { useMutation } from "react-query";
function App() {
const { data, isLoading, mutate } = useMutation(**mutate를 위한 패치함수**, options);
/* ↑ 같은 거 ↓ */
const { data, isLoading, mutate } = useMutation(mutationFn, options);
}
isIdle
or status
=== 'idle' : 가동되지 않은 상태이거나 새로 고침/재설정된 상태isLoading
or status
=== 'loading' : 실행 중isError
or status
=== 'error' : 오류 발생error
: 해당 property로 에러 메세지를 확인할 수 있음)isSuccess
or status
=== 'success' - 성공하여 데이터 사용 가능data
: 해당 property로 성공한 데이터를 확인할 수 있음)import useMutation
import { useMutation } from 'react-query';-
mutate를 위해 필요한 인자들이 포함된 패치함수 import
import { 패치함수 } from "패치함수 경로";
새로운 useMutation
변수를 선언
const mutation = useMutation(**패치함수**);
변경 값 패치함수로 전달
import { useMutation } from 'react-query';
import { 패치함수 } from "패치함수 경로";
export default function ChildrenCompnt() {
const mutation = useMutation(**패치함수**);
/* 이 부분 */
const handleSubmit = (e) => {
e.preventDefault();
mutation.mutate(inputValue)
};
/* 이 부분 */
return (
<>
<form onSubmit={handleSubmit}>
<label>
변경할 닉네임:
<input type="text" value={inputValue} onChange={handleChange} />
</label>
</form>
</>
);
}
invalidateQueries()
를 사용하면 개발자가 명시적으로 query가 stale 되는 지점을 찝어줄 수 있다. 해당 메소드가 호출되면 쿼리가 바로 stale 되고, 리패치가 진행된다.useQueryClient()
Hook 사용queryClient.invalidateQueries();
// 캐시가 있는 모든 쿼리들을 invalidate한다.
queryClient.invalidateQueries('todos');
// 'todos'로 시작하는 모든 쿼리들을 invalidate한다.
queryClient.invalidateQueries({
predicate: (query) => query.queryKey[0] === 'todos' && query.queryKey[1]?.version >= 10,
});
import useQueryClient
import { useQueryClient } from 'react-query';-
새로운 useQueryClient
변수를 선언
const queryClient = useQueryClient();
invalidateQueries()
를 사용하여 캐시가 있는 모든 쿼리들을 invalidate
import { useMutation, useQueryClient } from "react-query";
import { 패치함수 } from "패치함수 경로";
export default function ChildrenCompnt() {
/* 이 부분 */
const mutation = useMutation(**패치함수**, {
onSuccess: () => {
queryClient.invalidateQueries()
}
});
/* 이 부분 */
const handleSubmit = (e) => {
e.preventDefault();
mutation.mutate(inputValue)
};
return (
<>
<form onSubmit={handleSubmit}>
<label>
변경할 닉네임:
<input type="text" value={inputValue} onChange={handleChange} />
</label>
</form>
</>
);
}