useSWRInfinite
๋ฅผ ์ ๊ณต// ๊ธฐ๋ณธ ํํ
import useSWRInfinite from 'swr/infinite'
// ...
const { data, error, isValidating, mutate, size, setsize } = useSWRInfinite(getKey, fetcher?, options?);
useSWR
๊ณผ ์ ์ฌํ ํํgetKey
, fetcher
, options
๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ฐ์useSWR
์ด ๋ฐํํ๋ ๋ชจ๋ ๊ฐ(data
, error
, isValidating
, mutate
) + size
, setSize
(React state์ ๊ฐ์)๋ฅผ ๋ฐํgetKey
: ํ์ฌ ํ์ด์ง์ ์ธ๋ฑ์ค(pageIndex
)์ ์ด ์ ํ์ด์ง์ ๋ฐ์ดํฐ(previousPageData
)๋ฅผ ๋ฐ๊ณ ํ์ด์ง์ ํค๋ฅผ ๋ฐํํ๋ ํจ์fetcher
์ ์ํด ํ์ฉ๋ ๊ฐ์ ๋ฐํnull
์ด ๋ฐํ๋๋ค๋ฉด, ํ์ด์ง์ ์์ฒญ์ด ์์๋์ง ์์const getKey = (pageIndex, previousPageData) => {
// ๋์ ๋๋ฌํ๋ฉด ํ์ด์ง๋ฅผ ์์ฒญํ์ง ์์
if(previousPageData && !previousPageData.length) return null;
// SWRํค ๋ฐํ
return `${API_ENDPOINT}?page=${pageIndex}&limit=10`;
}
fetcher
: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํจ์๋ฅผ ๋ฐํํ๋ Promise๋ก SWR์ key
๋ฅผ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์(useSWR
์ fetcher
์ ๋์ผ)
options
: SWR hook์ ์ํ ์ต์
๊ฐ์ฒด, useSWR
์ด ์ง์ํ๋ ๋ชจ๋ ์ต์
+ ์๋์ ๋ค ๊ฐ์ ์ต์
initialSize = 1
: ์ด๊ธฐ์ ๋ก๋ํด์ผ ํ๋ ํ์ด์ง ์revalidateAll = false
: ํญ์ ๋ชจ๋ ํ์ด์ง์ ๊ฐฑ์ ์๋revalidateFirstPage = true
: ํญ์ ์ฒซ ํ์ด์ง์ ๊ฐฑ์ ์๋persistSize = false
: ์ฒซ ํ์ด์ง์ ํค๊ฐ ๋ณ๊ฒฝ๋ ๋, ํ์ด์ง ํฌ๊ธฐ๋ฅผ 1๋ก ์ด๊ธฐํํ์ง ์์(initialSize
๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ initialSize
)initialSize
์ต์
์ lifecycle์์ ๋ณ๊ฒฝํ ์ ์๋ค.data
: ์ฃผ์ด์ง ํค์ ๋ํ ๋ฐ์ดํฐ์ ๊ฐ ํ์ด์ง์ response์ ๋ฐฐ์ด// data ์์
[
[
{ name: 'Alice', ... },
{ name: 'Bob', ... },
{ name: 'Cathy', ... },
...
],
[
{ name: 'John', ... },
{ name: 'Paul', ... },
{ name: 'George', ... },
...
],
...
]
error
: fetcher
๊ฐ ๋์ง ์๋ฌ ๋๋ undefined
(useSWR
์ error
์ ๋์ผ)isValidating
: ์์ฒญ์ด๋ ๊ฐฑ์ ์ ๋ก๋ฉ ์ฌ๋ถ(useSWR
์ isValidating
์ ๋์ผ)mutate
useSWR
์ ๋ฐ์ธ๋ฉ ๋ mutate
ํจ์์ ๋์ผํ์ง๋ง ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ค๋ฃธsize
: ๊ฐ์ ธ์ฌ ํ์ด์ง ๋ฐ ๋ฐํํ ํ์ด์ง์ ์setSize
: ๊ฐ์ ธ์ฌ ํ์ด์ง์ ์๋ฅผ ์ค์ console
๋ก ํ์ธuseEffect(() => {
console.log(data);
}, [data]);
pageIndex
์ setSize
์ ๊ด๊ณsetSize
๋ฅผ ํ ๋ ๋ง๋ค getKey์ pageIndex
์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ํ๋๋์ง console
๋ก ํ์ธโ console
๋ก ํ์ธํด๋ณด๋ ์์ ์ค๋ช
๋ค์ด ์ดํด๊ฐ ๊ฐ๊ธฐ ์์ํ๋ค.
pageIndex
์ ์ด๊ธฐ๊ฐ = 0
limit=10
์ผ๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ๊ฐ 10๊ฐ์ฉ ํ๋์ ๋ฐฐ์ด๋ก ๋ฌถ์ธ๋ค.setSize
์ ๋ฐ๋ผ ํ๋์ ๋ฐฐ์ด๋ก ๋ฌถ์ธ 10๊ฐ์ ๋ฐ์ดํฐ๊ฐ size
๋งํผ ๋ํ๋๋ค.setSize(1)
์ด๋ผ๋ฉด,pageIndex=0
์ธ getKey ํธ์ถsetSize(3)
์ด๋ผ๋ฉด,pageIndex=0
์ธ getKey ํธ์ถpageIndex=1
์ธ getKey ํธ์ถpageIndex=2
์ธ getKey ํธ์ถsetSize
์ ๊ฐ ๋งํผ pageIndex
๊ฐ ํ๋์ฉ ์ฆ๊ฐํ๋ฉด์ getKey๊ฐ ํธ์ถ๋๋ ๋ฐฉ์Array.flat()
์ ์ด์ฉํ์ฌ 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ฃผ๊ธฐArray.flat()
์ V8 ๋ธ๋ผ์ฐ์ ์์ง์์ ์ต์ ํ ๋์ด ์์ง ์์ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค๊ณ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค. Array.prototype.map()
์ ์ฌ์ฉํ์ฌ ๋ง๋ฌด๋ฆฌ๐ค์ฐธ๊ณ
์ฐ์ ๋๋ฌด ๋ด์ฉ์ด ์์ฐจ๊ณ ์ข๋ค์~!