Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- utilty type
- 개발콘텐츠
- CSS
- JS console
- 레이아웃쪼개기
- 반복줄이기
- react
- TSDoc
- typescript
- 리액트
- returnType
- reactjs
- javascript
- 티스토리꾸미기
- 타입스크립트
- 2022
- 제네릭
- 공통컴포넌트
- vue.js
- click and drag
- 타입좁히기
- 폰트적용하기
- 성능최적화
- Chart.js
- const 단언문
- NonNullable
- React.js
- 누구나 자료구조와 알고리즘
- React Native
- 커스텀
Archives
- Today
- Total
몽땅뚝딱 개발자
[React] react-query와 API 정리 본문
◽ react-query란?
React에서 상태 관리를 하다보면 클라이언트와 서버 데이터가 공존하면서 생기는 문제들이 있다고 한다.
- 캐싱이 가능하다.
- get을 한 데이터에 대해 update를 하면 자동으로 get을 수행한다.
- 동일 데이터를 여러번 요청하는 경우 한번만 요청한다.
◽ react-query 설치하기
$ npm i react-query
◽ react-query 기본 형태
import { QueryClient, QueryClientProvider, useQuery } from 'react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isLoading, error, data } = useQuery('repoData', () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(res =>
res.json()
)
)
if (isLoading) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
<strong>👀 {data.subscribers_count}</strong>{' '}
<strong>✨ {data.stargazers_count}</strong>{' '}
<strong>🍴 {data.forks_count}</strong>
</div>
)
}
react-query의 주요 API
1. useQuery( param1
queryKey(=uniqueKey), param2
queryFn(=API 호출 함수), param3
옵션값 )
데이터를 get하기 위한 api 이다.
- 첫번째 파라미터: unique key를 설정한다. string과 배열 둘 다 key가 될 수 있다.
- 두번째 파라미터: API를 호출하는 비동기로 작동하는 함수가 들어간다.
- 세번째 파라미터: enabled 등의 옵션값이 들어간다.
📄 예제 1. 기본 예제
const { isLoading, isError, data, error } = useQuery("todos", fetchTodoList, {
refetchOnWindowFocus: false, // 재실행 여부 옵션
retry: 0, // 실패시 재호출 시도 횟수
onSuccess: data => {
// 성공시 호출
console.log(data);
},
onError: e => {
// 실패시 호출 401, 404 같은 error가 아니라 api 호출 자체가 실패한 경우
console.log(e.message);
}
});
📄 예제 2. status로 한번에 처리하기
isLoading, isSuccess 말고 한번에 처리가 가능하다.
function Todos() {
const { status, data, error } = useQuery("todos", fetchTodoList);
if (status === "loading") {
return <span>Loading...</span>;
}
if (status === "error") {
return <span>Error: {error.message}</span>;
}
return (
<ul>
{data.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
);
}
📄 예제 3. enabled을 사용하여 동기적으로 호출하기
enabled를 사용하면 useQuery를 동기적으로 호출할 수 있다.
const { data: todoList, error, isFetching } = useQuery("todos", fetchTodoList);
const { data: nextTodo, error, isFetching } = useQuery(
"nextTodos",
fetchNextTodoList,
{
enabled: !!todoList // true가 되면 fetchNextTodoList를 실행한다
}
);
2. useQueries([ param1
queryKey(=uniqueKey), param2
queryFn(=API 호출 함수) ])
post, update에 사용한다.
const result = useQueries([
{
queryKey: ["getRune", riot.version],
queryFn: () => api.getRunInfo(riot.version)
},
{
queryKey: ["getSpell", riot.version],
queryFn: () => api.getSpellInfo(riot.version)
}
]);
3. useMutation( param1
queryKey(=uniqueKey), param2
queryFn(=API 호출 함수), param3
옵션값 )
post, update 시에 사용한다.
- onMutate: mutation 함수가 실행되기 전에 실행되고 mutation 함수가 받을 동일한 변수가 전달된다.
- onError: mutation이 error를 만났을 때 실행된다.
- onSuccess: mutation이 성공하고 결과를 전달할 때 실행된다.
- onSettled: 성공여부에 관계없이 실행된다.
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");
}
});
출처
개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.
'Development > React.js · Next.js' 카테고리의 다른 글
[React] ThemeProvider 사용하기 (0) | 2023.02.15 |
---|---|
[React] 리덕스(Redux) (0) | 2023.02.14 |
[React] stylelint, prettier, eslint 적용하기 (작성 중) (0) | 2023.02.10 |
[React] 라우터(Router)와 레이아웃(Layout) 쪼개기 (0) | 2023.02.09 |
[React] 스타일드 컴포넌트(styled-component)로 공통 컴포넌트 버튼 테마 분리하기 (with. 타입스크립트) (0) | 2023.02.09 |
Comments