νμ΄μ§ 맀κΉ(Pagination)μ ꡬνν μ§λ ν¬μ€ν μμλ μ¬μ©μ κ²½νμ΄ μ’μ§ μμμ΅λλ€.
- νμ΄μ§κ° μΊμμ μκΈ° λλ¬Έμ λλ€.
- Next Page λ²νΌμ λλ₯Ό λλ§λ€ νμ΄μ§κ° λ‘λ©λκΈΈ κΈ°λ€λ €μΌ νμ΅λλ€.
μ΄λ²μλ λ°μ΄ν°λ₯Ό 미리 κ°μ Έμ μΊμμ λ£μ΄μ μ¬μ©μ κ²½νμ κ°μ νκ² μ΅λλ€.
Prefetching β
ν리ν¨μΉμ λ°μ΄ν°λ₯Ό μΊμμ μΆκ°νλ©° , ꡬμ±ν μ μκΈ΄ νμ§λ§ κΈ°λ³Έκ°μΌλ‘ λ§λ£(stale) μν μ λλ€.
- μ¦, λ°μ΄ν°λ₯Ό μ¬μ©νκ³ μ ν λ λ§λ£ μνμμ λ°μ΄ν°λ₯Ό λ€μ κ°μ Έμ΅λλ€.
- λ°μ΄ν°λ₯Ό κ°μ Έμ€λ μ€μλ μΊμμ μλ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ νλ©΄μ λνλ λλ€.
λ¬Όλ‘ μΊμκ° λ§λ£λμ§ μμλ€λ κ°μ νμ μΌ μ λλ€.
- μ΄λ κ² μΆν μ¬μ©μκ° μ¬μ©ν λ²ν λͺ¨λ λ°μ΄ν°μ ν리ν¨μΉμ μ¬μ© ν©λλ€.
- νμ΄μ§ 맀κΉ, λ€μμ μ¬μ©μκ° μΉμμ ν΅κ³μ μΌλ‘ νΉμ νμ λλ₯Ό νλ₯ μ΄ λμ κ³³μ΄λΌλ μ§
- ν΄λΉ λ°μ΄ν°λ₯Ό 미리 κ°μ Έμ€λ κ²μ΄ μ’μ΅λλ€.
μ°Έκ³ μλ£ : prefetching
β useQueryClient
prefetch 쿼리λ queryClient μ λ©μλ
import { useQuery, useQueryClient } from "react-query";
β μ»΄ν¬λνΈλ‘ κ°μ Έμ¬ λ
const queryClient = useQueryClient();
μ€νν λ μ μν΄μΌ ν©λλ€.
- λ€μ νμ΄μ§λ‘ onClick μ μ€ννλ 건 μ’μ μκ°μ΄ μλλλ€.
- μν μ λ°μ΄νΈκ° λΉλκΈ°μμΌλ‘ μΌμ΄λκΈ° λλ¬Έμ μ΄λ―Έ μ λ°μ΄νΈκ° μ§νλλμ§ μ λ°©λ²μ΄ μμ΅λλ€.
- νμ¬ νμ΄μ§κ° 무μμΈμ§ μ μ μλ νμ€ν λ°©λ²μ΄ μμ΅λλ€.
- λμ useEffect λ₯Ό μ¬μ©ν΄μ νμ¬ νμ΄μ§μ μκΈ°λ λ³κ²½ μ¬νμ νμ© νκ² μ΅λλ€.
β queryClient.prefetchQuery()
useEffect(()=>{
const nextPage = currentPage + 1;
queryClient.prefetchQuery()
},[currentPage])
νμ¬ νμ΄μ§κ° λ³κ²½λ λλ§λ€ μμ ν¨μλ₯Ό μ€νν κ² μ λλ€.
- λ€μ νμ΄μ§κ° 무μμ΄λ λ°μ΄ν°λ₯Ό 미리 κ°μ ΈμμΌ ν©λλ€.
β prefetchQuery μΈμλ useQuery μ μΈμμ μμ£Ό ν‘μ¬ ν©λλ€.
queryClient.prefetchQuery('쿼리 ν€', '쿼리 ν¨μ');
- useQueryμ μ¬μ©ν 쿼리 ν€μ λκ°μ λͺ¨μ΅μ νκ³ μμ΅λλ€.
- React Queryκ° μΊμμ μ΄λ―Έ λ°μ΄ν°κ° μλμ§ μ¬κΈ°μ νμΈ ν©λλ€.
useEffect(()=>{
const nextPage = currentPage + 1;
queryClient.prefetchQuery(['posts', nextPage], () => fetchPosts(nextPage))
},[currentPage, queryClient]);
β μμΈ μ²λ¦¬
useEffect(()=>{
if(currentPage < maxPostPage){
const nextPage = currentPage + 1;
queryClient.prefetchQuery(['posts', nextPage], () => fetchPosts(nextPage));
}
},[currentPage, queryClient])
- 9 νμ΄μ§ μ΄μ μ΄λΌλ©΄ ν리ν¨μΉμ΄ μ΄λ£¨μ΄μ§μ§λ§, 10νμ΄μ§μ μλ€λ©΄ 미리 κ°μ Έμ¬ λ°μ΄ν°κ° μμ΅λλ€.
β keepPreviousData
쿼리 ν€κ° λ°λ λλ μ§λ λ°μ΄ν° μ μ§
- νΉμ¬λ μ΄μ νμ΄μ§λ‘ λμκ°μ λ μΊμμ ν΄λΉ λ°μ΄ν°κ° μλλ‘ λ§λ€κ³ μΆμ΅λλ€.
const {data, isLoading, isError, error} = useQuery(['posts', currentPage],
() => fetchPosts(currentPage), {staleTime : 2000, keepPreviousData : true});
β μ 체 μ½λ
import React, { useEffect, useState } from "react";
import { QueryClient, useQuery, useQueryClient } from "react-query";
import { PostDetail } from "./PostDetail";
const maxPostPage = 10;
async function fetchPosts(pageNum) {
const response = await fetch(
`https://jsonplaceholder.typicode.com/posts?_limit=10&_page=${pageNum}`
);
return response.json();
}
export function Posts() {
const [currentPage, setCurrentPage] = useState(1);
const [selectedPost, setSelectedPost] = useState(null);
const queryClient = useQueryClient();
useEffect(()=>{
if(currentPage < maxPostPage){
const nextPage = currentPage + 1;
queryClient.prefetchQuery(['posts', nextPage], () => fetchPosts(nextPage));
}
},[currentPage, queryClient])
// replace with useQuery
const {data, isLoading, isError, error} = useQuery(['posts', currentPage],
() => fetchPosts(currentPage), {staleTime : 2000, keepPreviousData : true});
// λ§μ½ λ‘λ© μ€μ΄λΌλ©΄
if(isLoading){
return <h3>Loading...</h3>;
}
if(isError){
return (
<React.Fragment>
<h3>Sorry, no Data</h3>
<p>{error.toString()}</p>
</React.Fragment>
)
}
return (
<>
<ul>
{data.map((post) => (
<li
key={post.id}
className="post-title"
onClick={() => setSelectedPost(post)}
>
{post.title}
</li>
))}
</ul>
<div className="pages">
<button disabled={currentPage <= 1} onClick={() => {setCurrentPage((currentPage) => currentPage - 1);}}>
Previous page
</button>
<span>Page {currentPage}</span>
<button disabled={currentPage >= maxPostPage} onClick={() => {setCurrentPage((currentPage) => currentPage + 1);}}>
Next page
</button>
</div>
<hr />
{selectedPost && <PostDetail post={selectedPost} />}
</>
);
}
β κ²°κ³Ό
κ°λ°μ λꡬλ₯Ό 보면 μΏΌλ¦¬κ° μμ΄κ³ μμ΅λλ€.
- μ μΌνκ² νμ± μνμΈ μΏΌλ¦¬λ νμ¬ νμ΄μ§μ λν 쿼리μ΄κ³ λλ¨Έμ§ μΏΌλ¦¬λ λ¨μ μμ΅λλ€.
- ννΈ μμ§ 9νμ΄μ§κ° μλλ° 9νμ΄μ§λ₯Ό 미리 κ°μ Έμ¨ κ²μ λ³Ό μ μμ΅λλ€.
- 9νμ΄μ§λ‘ κ°λ©΄ 10νμ΄μ§λ₯Ό 미리 κ°μ Έμ΅λλ€.
μ΄μ²λΌ λ°μ΄ν°λ₯Ό μΊμμ μΆκ°νκΈ° λλ¬Έμ λ€μ νμ΄μ§λ₯Ό λμ΄κ°λ©΄ λ°λ‘ λ³Ό μ μμ΅λλ€.
μ°Έκ³
'π Front-End > React.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
React Query - λ³μ΄(Mutation) (0) | 2022.10.25 |
---|---|
React Query - isFetching VS. isLoading (0) | 2022.10.25 |
React Query - νμ΄μ§ 맀κΉ(Pagination) (0) | 2022.10.25 |
React Query - 쿼리 ν€ (0) | 2022.10.25 |
React Query - staleTime vs cacheTime (0) | 2022.10.25 |