Front-End/Library

Library] SWR : ์‘์šฉ_Pagination & InfiniteScroll(useSWRInfinite)

์™•๊ฐ€๐Ÿ‘ 2023. 7. 4. 13:33
728x90
๋ฐ˜์‘ํ˜•

์ผ๋ฐ˜์ ์ธ pagenation์€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ , useSWRInfinite์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

https://swr.vercel.app/ko/docs/pagination

Pagination

๊ธฐ๋ณธ pagination์€ useSWRInfinite๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

function Page ({ index }) {
  const { data } = useSWR(`/api/data?page=${index}`, fetcher);
 
  // ... ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌ
 
  return data.map(item => <div key={item.id}>{item.name}</div>)
}
 
function App () {
  const [pageIndex, setPageIndex] = useState(0);
 
  return <div>
    <Page index={pageIndex}/>
    <div style={{ display: 'none' }}><Page index={pageIndex + 1}/></div>
    <button onClick={() => setPageIndex(pageIndex - 1)}>Previous</button>
    <button onClick={() => setPageIndex(pageIndex + 1)}>Next</button>
  </div>
}

 

๊ฐ„๋‹จํ•˜๊ฒŒ useSWR์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค divํƒœ๊ทธ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

api ์ฃผ์†Œ๋งŒ ๋งž์ถ”๋ฉด, ํฐ ๋ฌด๋ฆฌ ์—†์ด ์–ธ์ œ ์–ด๋””์„œ๋“  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๋ฒ•ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. 

 

display : 'none'์„ ์ถ”๊ฐ€ํ•ด์„œ SWR์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ฆฌ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ๊ณตํ™ˆ์—์„œ ์†Œ๊ฐœํ•ด์ฃผ๋Š”๋ฐ,

๋ฏธ๋ฆฌ ๊ทธ๋ ค๋†“๊ณ  ๋ฐ”๊ฟ”์ฃผ๋ฉด ์†๋„ ์ธก๋ฉด์—์„œ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

 

 


 

 

Infinite Scroll

์ด ๊ธ€์˜ ๋ชฉ์ ์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์–ด์„œ์˜€์Šต๋‹ˆ๋‹ค.

๋ฌดํ•œ ์Šคํฌ๋กค๋กœ ์Šคํฌ๋กค์ด ๋์—†์ด ๋‚ด๋ ค๊ฐ€๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

import useSWRInfinite from 'swr/infinite'
 
const { data, error, isLoading, isValidating, mutate, size, setSize } = useSWRInfinite(
  getKey, fetcher?, options?
)

 

parameter

  • getKey : index์™€ ์ด์ „ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ  ํŽ˜์ด์ง€์˜ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • fetcher : useSWR๊ณผ ๋™์ผ
  • option : useSWR๊ณผ ๋™์ผํ•˜๋ฉฐ, ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. ๊ณตํ™ˆ์—์„œ ํ™•์ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 


 

 

return

  • data : fetcher์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹ ์„ ํ–ˆ์„ ๋•Œ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’
  • size : ๊ฐ€์ ธ์˜ฌ ํŽ˜์ด์ง€ ๋ฐ ๋ฐ˜ํ™˜๋  ํŽ˜์ด์ง€ ์ˆ˜ (state๊ฐ’)
  • setSize : ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€์˜ ์ˆ˜
  • error, isLoading, isValidating, mutate๋Š” useSWR๊ณผ ๋™์ผ

 

 


 

 

์˜ˆ

const getKey = (pageIndex, previousPageData) => {
  if (previousPageData && !previousPageData.length) return null
  return `/users?page=${pageIndex}&limit=10`                   
}
 
function App () {
  const { data, size, setSize } = useSWRInfinite(getKey, fetcher)
  if (!data) return 'loading'
 
  return <div>
    <p>users listed</p>
    {data.map((users, index) => {
      return users.map(user => <div key={user.id}>{user.name}</div>)
    })}
    <button onClick={() => setSize(size + 1)}>Load More</button>
  </div>
}

 

getKey ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ useSWR์ฒ˜๋Ÿผ key๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋์— ๋„๋‹ฌํ–ˆ์œผ๋ฉด null๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

useSWR์ด๋ž‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

 

๋™์ž‘ ์›๋ฆฌ๋ฅผ ์„ค๋ช… ๋“œ๋ฆฌ์ž๋ฉด,

  1. getKey๊ฐ€ ์‹คํ–‰๋˜์–ด ์ฒซ ํŽ˜์ด์ง€ pageIndex ๊ฐ’์ด 0์œผ๋กœ returnํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  2. return ๋œ key๊ฐ’์œผ๋กœ fetcher๊ฐ€ ์‹คํ–‰๋˜์–ด ๋ฆฌํ„ด๊ฐ’์ด data์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  3. Load More๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
  4. setSize๋ฅผ ํ†ตํ•ด size๊ฐ’์ด +1๋์Šต๋‹ˆ๋‹ค.
  5. size๋Š” state๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ณ , useSWRInfinite๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  6. ๊ทธ๋Ÿฌ๋ฉด์„œ getKeyํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰์ด๋˜๊ณ , size๋Š” pageIndex์˜ ์ธ์ž๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
  7. ๋‘ ๋ฒˆ์งธ ํŽ˜์ด์ง€์˜ ๋ฆฌํ„ด๊ฐ’๋“ค์ด data์— ๋ˆ„์ ๋˜์–ด ์Œ“์ด๊ฒŒ ๋˜๊ณ , ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 


 

 

Global Mutate

import { useSWRConfig } from "swr"
import { unstable_serialize } from "swr/infinite"
 
function App() {
    const { mutate } = useSWRConfig()
    mutate(unstable_serialize(getKey))
}

 

binding mutate๋Š” useSWR๊ณผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , global๋งŒ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 


 

 

SWR์€ ์ด ์ •๋„๋ฉด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์€ ์„ค๋ช…ํ•œ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•ด ๋ณด์ด๋Š” ๊ฒƒ๋“ค์€ ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ์„ ๋“ฏ์‹ถ๊ธด ํ•ฉ๋‹ˆ๋‹ค.

SWR์ด๋ž‘ React-Query๋ž‘ ์ œ์ผ ๋งŽ์ด ๋น„๊ต๋˜๋Š”๋ฐ, 
React-Query๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ์‚ฌ์šฉ๋ฒ•์ด๋‚˜ ๊ฐœ๋…์€ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
SWR๋ณด๋‹ค๋Š” React-Query๊ฐ€ ๋‹ค์šด๋กœ๋“œ์ˆ˜๊ฐ€ ๋งŽ๊ธฐ ํ•˜๋Š” ํ•œ๋ฐ, ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ ๋น„์Šทํ•ด์ง„ ๊ฑฐ ๋ด์„œ๋Š” ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋งŒ ์ž˜ ์จ๋„ 
๋ฌธ์ œ์—†์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
728x90

'Front-End > Library' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Library] swagger-ui-react  (0) 2023.07.07
Library] SWR : ์‘์šฉ_Mutate & Revalidation  (0) 2023.07.03
Library] SWR : ์‘์šฉ  (0) 2023.07.03
Library] SWR  (0) 2023.07.03
Library] Swiper  (0) 2023.06.29