React Query
는 우리가 실행하고 있었던 로직을 축약해준다.npm i @tanstack/react-query
client
생성 후 provider
에 보낸다.// index.js
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import App from "./App";
const queryClient = new QueryClient();
const root = ReactDOM.createRoot(document.getElementById("root")!);
root.render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</React.StrictMode>
);
useQuery
는 key
와 fetcher
를 인자로 받는다.fetcher
는 data
를 가져오는 함수를 가리킨다.fetcher
리턴값은 Promise
여야 한다.// tempDB.json
{
"temp": {
"id": 1,
"recruits": 3,
"nickName": "haha"
}
}
// api.ts
export async function getTemp() {
return await fetch(`${BASE_URL}/temp?id=1`, {
method: "GET",
headers: {
"Content-Type": "application/json",
},
}).then((response) => response.json());
}
// TempComponent.tsx
function TempComponent() {
const { data } = useQuery(["tempData"], getTemp);
console.log(data);
// {id: 1, recruits: 3, nickName: 'haha'}
return <h1>Hi, Json Dummy!</h1>;
}
react query
로 로드한 비동기 데이터를 변경할 때는 useMutation
을 이용해 변경한다.// api.ts
export async function patchTemp(newName:string) {
return await fetch(`${BASE_URL}/temp?id=1`, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ nickName: newName }),
}).then((response) => response.json());
}
// TempComponent.tsx
function TempComponent() {
const queryClient = useQueryClient();
const mutation = useMutation(
({ newName }: { newName: string }) => patchTemp(newName),
{ onSuccess: () => queryClient.invalidateQueries() }
);
const [temp, setTemp] = useState("");
const onChange = (e: React.ChangeEvent<HTMLInputElement>) =>
setTemp(e.currentTarget.value);
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
mutation.mutate({ newName: temp });
setTemp("");
};
return (
<div
style={{
width: "100vw",
height: "100vh",
display: "flex",
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
}}
>
<form onSubmit={onSubmit}>
<input type="text" value={temp} onChange={onChange} />
<button type="submit">제출</button>
</form>
<div>
<span>NickName :</span>
<span> {data?.nickName}</span>
</div>
</div>
)
}
useMutation
에서 호출하는 비동기 함수가 인자를 가지고 있다면 위 예제처럼 화살표 함수를 통해 들어갈 인자를 정의한다.mutate
를 호출해 인자를 담는다.React Query
캐시를 재구성하고 싶다면 useQueryClient
를 호출한 후 useMutation
의 onSuccess
에 queryClient.invalidateQueries
를 실행하도록 한다.React Query
키를 제거하고 싶다면 queryClient.removeQueries
에 제거할 키를 입력한다.npm i -D @tanstack/react-query-devtools
를 설치하면 크롬의 React Dev Tools
확장앱처럼 브라우저에서 React Query
의 캐시 등을 확인할 수 있다.// App.tsx
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
function App() {
return (
<React.Fragment>
<Home />
<ReactQueryDevtools />
</React.Fragment>
);
}
useQuery
옵션에 refetchInterval
을 설정해 주기적으로 refetch
할 수 있다.function JsonPlaceHolder() {
const { isLoading, data } = useQuery<JPH>(["jpData"], fetchJsonPlaceHolder, {
refetchInterval: 5000,
});
return <h1>Hi, Json Dummy!</h1>;
}