[React] useInfiniteQuery + IO API ์ฌ์ฉ์ ๋ฌดํ ๋ ๋๋ง ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ์์ธ
๋ ๋๋ง ๋ฐ์ดํฐ์ ๋ง์ง๋ง ์ธ๋ฑ์ค ์์น์ IO(Intersection Observer) ๊ด์ฐฐ ์์๋ฅผ ํ์ํ๋ ๋ฐฉ์์ ๋ฌดํ ๋ ๋๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ 1~2๊ฐ ๋ฐ์ ์์ด์ ๊ด์ฐฐ ์์๊ฐ ํญ์ ํ๋ฉด์ ๋ค์ด์จ๋ค๋ฉด โfetchNextPage
์คํ(React Query ํ
์ด ๋ฐํํ๋ ํจ์) → โ๊ธฐ์กด ๋ฐ์ดํฐ ๋ฐํ → โ๋ ๋ → โIO ํ๋ฉด์ ๋ค์ด์ด → โfetchNextPage
์คํ → ๋ฐ๋ณต…
์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณตํ๋ฉด์ ๋ฌดํ ๋ ๋๋งํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. Query Key๊ฐ ๋ฐ๋์ง ์์์ ๋ฐ์ดํฐ fetch ์์ด ์บ์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ฌดํ ๋ ๋๋ง ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ์๋ํ์ง ์๋๋ค. ๋ฐ์ดํฐ๊ฐ ์์ ์๋ค๋ฉด IO ๊ด์ฐฐ ๋์ ์์๋ ๋ ๋๋ง ํ์ง ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๋๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ๋ ๋ฒ๊ทธ.
// queryKey ๋ฐ queryFn ์๋ต
const { data, fetchNextPage } = useInfiniteQuery(queryKey, queryFn);
const { setObservationTarget } = useIntersectionObserver({
onIntersect: ([{ isIntersecting }]) => isIntersecting && fetchNextPage(),
});
const renderData = data?.pages.flatMap(({ data }) => data.orders);
return (
<div>
{renderData?.map((order, i, { length }) => (
<Fragment key={order.order_id}>
<OrderListItem data={order} />
{i === length - 1 && <div ref={setObservationTarget} />} {/* ๋ฌธ์ ์ ์ฝ๋ */}
</Fragment>
))}
</div>
);
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ ๋ฌธ์ ๋ IO ๊ด์ฐฐ ์์ ํ์ ์กฐ๊ฑด์ ์ง์ ํ ๋ useInfiniteQuery
ํ
์ด ๋ฐํํ๋ hasNextPage
๋ฅผ ์ด์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค. hasNextPage
๊ฐ์ getNextPageParam
(๋ค์ ์์ฒญ์ ์ฌ์ฉํ pageParam
์ ์ง์ ํ๋ ํจ์)์ด ๋ฐํํ๋ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. getNextPageParam
ํจ์๊ฐ truthy ๊ฐ์ ๋ฐํํ๋ฉด hasNextPage
๋ true
๊ฐ ๋๊ณ undefined
๋ฅผ ๋ฐํํ๋ฉด false
๊ฐ ๋๋ค.
const { data, fetchNextPage, isFetching, hasNextPage } = useInfiniteQuery(
queryKey, // ์๋ต
queryFn, // ์๋ต
{ getNextPageParam: (lastPage) => lastPage.data.cursor ?? undefined },
// cursor๋ ๋ค์ ์์ฒญ์ pageParam์ผ๋ก ์ฌ์ฉ๋จ. ๊ฐ์ 'ISO format string' | null
);
// ...
return (
<div>
{renderData?.map((order) => (
<Fragment key={order.order_id}>
<OrderListItem data={order} />
{hasNextPage && <div ref={setObservationTarget} />} {/* ์์ ํ ์ฝ๋ */}
</Fragment>
))}
</div>
);
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] Array.flatMap ๋ฉ์๋ ํ์ฉ๋ฒ (0) | 2024.05.09 |
---|---|
[JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ โ toLocaleDateString (0) | 2024.05.09 |
[TS] ํ์ ์คํฌ๋ฆฝํธ ๋ ์ข ๋ฅ์ ํค(key) ํ์ ์ ๋ฐ์ ๋ ๊ฐ์ฒด ์ ๊ทผํ๊ธฐ (0) | 2024.05.08 |
[React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ (0) | 2024.05.08 |
[Next.js] document is not defined ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2024.05.08 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] Array.flatMap ๋ฉ์๋ ํ์ฉ๋ฒ
[JS] Array.flatMap ๋ฉ์๋ ํ์ฉ๋ฒ
2024.05.09 -
[JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ — toLocaleDateString
[JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ — toLocaleDateString
2024.05.09 -
[TS] ํ์ ์คํฌ๋ฆฝํธ ๋ ์ข ๋ฅ์ ํค(key) ํ์ ์ ๋ฐ์ ๋ ๊ฐ์ฒด ์ ๊ทผํ๊ธฐ
[TS] ํ์ ์คํฌ๋ฆฝํธ ๋ ์ข ๋ฅ์ ํค(key) ํ์ ์ ๋ฐ์ ๋ ๊ฐ์ฒด ์ ๊ทผํ๊ธฐ
2024.05.08 -
[React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ
[React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ
2024.05.08