일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- This
- function 문
- BIND
- moment.js
- react router
- Execution Context
- activation object
- hoisting
- happy hacking
- 실행컨텍스트
- 화살표 함수
- lexical environment
- scope chain
- 함수
- JavaScript
- react-router
- 정적스코프
- 객체
- 자바스크립트
- Arrow function
- 리액트 라우터
- vs code
- 함수 표현식
- webstorm
- 호이스팅
- function 표현식
- variable object
- lexical scope
- function
- type
- Today
- Total
Pandaman Blog
[React Query] Default Query Function 본문
1. Default Query Function
https://codesandbox.io/s/default-query-function-yeje-wyfbxm?file=/src/index.js
동일한 쿼리 기능을 공유하고 쿼리 키를 사용하여 가져와야 할 항목을 식별할 수 있기를 원하는 경우 default query function
기능을 사용할 수 있다.
만약 리스트 호출하는 API와 그 상세에 해당하는 API가 아래와 같다고 가정해보자.
https://jsonplaceholder.typicode.com/posts
https://jsonplaceholder.typicode.com/posts/:id
위와 같은 API를 useQuery를 사용한다면 각각 아래와 같이 사용할 수 있다.
const fetchPosts = async () => {
const { data } = await axios.get(
'https://jsonplaceholder.typicode.com/posts'
);
return data;
};
const fetchPost = async (postId) => {
const { data } = await axios.get(
`https://jsonplaceholder.typicode.com/posts/${postId}`
);
return data;
};
const queryClient = new QueryClient();
const { status, data, error, isFetching } = useQuery("posts", () => fetchPosts());
const { status, data, error, isFetching } = useQuery(["posts", postId], () => fetchPost(postId));
fetchPosts, fetchPost 각각 정의했다. queryClient 인스턴스를 생성하고 useQuery를 사용하여 queryKey와 queryFn을 할당했다.
여기서 더 간소화시킬 수 있을까?(간소화되었다고 좋은 건 아니지만) 그렇다.
fetchPosts와 fetchPost를 한 개의 비동기 함수로 만들어보자.
const fetchPosts = async () => {
const { data } = await axios.get(
'https://jsonplaceholder.typicode.com/posts'
);
return data;
};
const fetchPost = async (postId) => {
const { data } = await axios.get(
`https://jsonplaceholder.typicode.com/posts/${postId}`
);
return data;
};
const defaultFetchPost = async ({ queryKey }) => {
if (queryKey[0] === "posts") {
return await fetchPosts();
} else {
const postId = queryKey[1];
return await fetchPost(postId);
}
};
const queryClient = new QueryClient();
const { status, data, error, isFetching } = useQuery("/posts", defaultFetchPost);
const { status, data, error, isFetching } = useQuery(`/posts/${postId}`, defaultFetchPost);
변경된 점은 useQuery에 두 번째 인자(queryFn)에 defaultFetchPost를 할당했다. defaultFetchPost의 인자인 queryKey는 Array이고 useQuery의 첫 번째 인자 queryKey에 해당한다. queryKey [0]가 "posts"인 경우는 fetchPosts를 호출, 아닌 경우는 fetchPost를 호출하도록 수정했다. defaultFetchPost가 useQuery에 중복으로 할당된 것을 확인할 수 있다. 이때 사용되는 option이 바로 defaultOptions
이며 여기서 queryFn
을 정의할 수 있다. queryFn을 정의하면 동일한 쿼리 기능을 공유
할 수 있다.
const defaultFetchPost = async ({ queryKey }) => {
if (queryKey[0] === "posts") {
return await fetchPosts();
} else {
const postId = queryKey[1];
return await fetchPost(postId);
}
};
const queryClient = new QueryClient({
defaultOptions: {
queries: {
queryFn: defaultFetchPost
}
}
});
const { status, data, error, isFetching } = useQuery("/posts");
const { status, data, error, isFetching } = useQuery(`/posts/${postId}`);
좀 깔끔해졌다. 이렇게 동일한 쿼리 기능을 공유하고 싶은 경우에는 defaultOptions을 사용을 고려해볼 필요가 있다.
'Front end > React-Query' 카테고리의 다른 글
[React Query] Pagination과 Infinite Scroll (0) | 2022.05.14 |
---|---|
[React Query] Query / Mutation 이해하기 (0) | 2022.04.11 |