Today, What I learned?
๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๋ฌดํ์คํฌ๋กค์ ์ ์ฉํด ๋ณด์๋ค.
๋ฌดํ์คํฌ๋กค๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ฒ์ ์์ง๊น์ง ์๋ํด๋ณด์ง ๋ชปํ๋ ๊ธฐ๋ฅ์ด์๋๋ฐ useInfiniteQuery ํ ์ ์ฌ์ฉํด์ ์๊ฐ๋ณด๋ค ์ฝ๊ฒ ์ ์ฉํ ์ ์์๋ค..!
FlatList
๋จผ์ FlatList์์ ๋ฌดํ์คํฌ๋กค์ ์ํด ํ์ํ ๋ ๊ฐ์ง ์์ฑ์ ์ถ๊ฐํด์ผ ํ๋ค.
<FlatList
onEndReached={fetchMoreTopRated}
onEndReachedThreshold={0.5}
...
/>
- onEndReached
๋์ ์ ๋๋ฌํ์ ๋ ์คํ์ํฌ ํจ์๊ฐ ๋ค์ด๊ฐ๋ ์์ฑ - onEndReachedThreshold
์คํฌ๋ฆฐ ๋์ด์ ๋๋ฌํ๊ธฐ ์ ์ ์ผ๋งํผ ๋จผ์ fetch ํจ์๋ฅผ ๋น ๋ฅด๊ฒ ์คํ์ํฌ ๊ฒ์ธ์ง์ ๋ํ ์์ฑ. ์ซ์๋ก ๋ค์ด๊ฐ๋ค.
1์ผ ๊ฒฝ์ฐ์ ๋์ ๋๋ฌํ์ ๊ฒฝ์ฐ ์คํ๋๋ค.
๋ก์ง์ ๊ตฌ์ฑ
๋ฌดํ ์คํฌ๋กค์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋์ง๋ฅผ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
๊ธฐ์กด ๋ฐฐ์ด : [1,2,3,4]
๋ฌดํ ์คํฌ๋กค ์ ์ถ๊ฐ๋ก fetch ํด์จ ๋ฐฐ์ด : [5,6,7]
์๋ก์ด state : [1,2,3,4,5,6,7]
state์ ๊ณ์ ๋์ ๋์ด ๊ฐฑ์ ๋๋ ๊ฒ์ด ํ์ํ๋ค!
๊ทธ๋ผ ๊ตฌ์ฒด์ ์ผ๋ก useInfiniteQuery ํ
์ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง ๋ณด์.
useInfiniteQuery
useInfiniteQuery ํ ์ ํ์ํ ์ธ์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ค.
- ์ฟผ๋ฆฌํค
- fetch ํจ์
- ์ต์ ๊ฐ์ฒด (getNextParam๊ฐ ๋ค์ด๊ฐ)
const {
data: upcomingData, isLoading, fetchNextPage, hasNextPage} = useInfiniteQuery(['Movies', 'Upcoming'],
getUpcomingMovies, {
getNextPageParam: (lastPage) => {
if (lastPage.page < lastPage.total_pages) {
return lastPage.page + 1;
}
},
});
์ ์ฝ๋๊ฐ ์ ์ฉํ ์ฝ๋์ธ๋ฐ ๋ณด๋ฉด ์ด๋ ๋ค.
์ฟผ๋ฆฌํค
์ฟผ๋ฆฌํค๋ก ['Movies', 'Upcoming'] ์ด๋ ๊ฒ ๋ ๊ฐ๊ฐ ๋ฐฐ์ด๋ก ๋ค์ด๊ฐ ์๋ค.
๋ฆฌ์กํธ ์ฟผ๋ฆฌ์ ์ฟผ๋ฆฌ ํค๋ ๋ฐฐ์ด๋ก ์ฌ๋ฌ ๊ฐ ์ ๋ฌํด์ฃผ๊ธฐ๋ ๊ฐ๋ฅ! Movies๋ ๋ค๋ฅธ useQuery ํจ์๋ค๊ณผ ๊ณต์ ํ๊ณ ์๋ ํค์ด๋ค.
fetch ํจ์
์ด์ด์ getUpcomingMovies
๋ผ๋ API์ ํต์ ํ๋, fetch ํจ์๋ฅผ ๋ฐ์์ค๊ณ ์๋ค.
ํ๋จ๋ถ์ ๋ฟ์์ ๊ฒฝ์ฐ ๋ค์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ pageParam์ ๋งค๊ฐ๋ณ์๋ก ์ด๋ค.
์ด ํจ์์ ๊ฒฐ๊ณผ๋ ์๋ฐ ํํ์ด๋ค.
{
"pageParams":[
"undefined"
],
"pages":[
{
"dates":[
"Object"
],
"page":1,
"results":[ // ์ง์ง ํ์ํ ๋ฐ์ดํฐ
"Array"
],
"total_pages":19,
"total_results":378
},
{
"dates":[
"Object"
],
"page":2,
"results":[ // ์ง์ง ํ์ํ ๋ฐ์ดํฐ
"Array"
],
"total_pages":19,
"total_results":378
}
...
]
}
ํ์ํ ์ ๋ณด๋ pages ์์ฑ ์์ ๊ฐ ๊ฐ์ฒด ์ results ๋ถ๋ถ์ด๋ผ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋งคํํ๋ ๊ณผ์ ํ์ํ๋ค..!
// [{1ํ์ด์ง dates, page...}, {}, {}]
// [[1ํ์ด์ง ์ํ์ ๋ณด..], [2ํ์ด์ง ์ํ์ ๋ณด..], []] // ๊ฐ ์์๋ฅผ results ๋ฐฐ์ด๋ก ์นํ
data.pages.map(page => page.results)
์์ ๊ฐ์ด map์ ๋๋ ธ์ ๋ 2์ฐจ์ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ flat()
์ผ๋ก ํํํ๊ฐ ํ์ํ๋ค!
๊ทธ๋์ ์ต์ข ์ ์ผ๋ก flatList์ data ์์ฑ์ ๋ค์ด๊ฐ ์ฝ๋๋ ์ด๋ ๋ค.
data.pages.map(page => page.results).flat()
์ต์ ๊ฐ์ฒด
๋ง์ง๋ง์ผ๋ก ์ต์
๊ฐ์ฒด ์์์ getNextPageParam์ด๋ผ๋
๊ฐ์ฒด์์ ์ฝ๋ฐฑํจ์๊ฐ ์๋ค.
getNextPageParam: (lastPage) => {
if (lastPage.page < lastPage.total_pages) {
return lastPage.page + 1;
}
},
์ด ์ฝ๋ฐฑํจ์์ ์ธ์์ธ lastPage๋ ์ ๋ฐ์ดํฐ๊ตฌ์กฐ์ pages ๊ฐ์ฒด๋ค.
pages ๊ฐ์ฒด ์์ page๊ฐ total_page๋ณด๋ค ์์ผ๋ฉด page๋ฅผ 1 ๋ํด์ fetch ํจ์๋ก ๋๊ฒจ์ค๋ค.
๊ทธ๋ผ ์คํฌ๋กค์ด ๋ค ๋ด๋ ค๊ฐ ๋๋ง๋ค ์๋์ ๊ฐ์ด ๋์ ๋๋ค.
LOG {"pageParams": [undefined], "pages": [{"dates": [Object], "page": 1, "results": [Array], "total_pages": 19, "total_results": 378}]}
LOG {"pageParams": [undefined], "pages": [{"dates": [Object], "page": 1, "results": [Array], "total_pages": 19, "total_results": 378}]}
LOG {"pageParams": [undefined, 2], "pages": [{"dates": [Object], "page": 1, "results": [Array], "total_pages": 19, "total_results": 378}, {"dates": [Object], "page": 2, "results": [Array], "total_pages": 19, "total_results": 378}]}
LOG {"pageParams": [undefined, 2], "pages": [{"dates": [Object], "page": 1, "results": [Array], "total_pages": 19, "total_results": 378}, {"dates": [Object], "page": 2, "results": [Array], "total_pages": 19, "total_results": 378}]}
LOG {"pageParams": [undefined, 2, 3], "pages": [{"dates": [Object], "page": 1, "results": [Array], "total_pages": 19, "total_results": 378}, {"dates": [Object], "page": 2, "results": [Array], "total_pages": 19, "total_results": 378}, {"dates": [Object], "page": 3, "results": [Array], "total_pages": 19, "total_results": 378}]}
์ต์ข ์ ์ผ๋ก ์ ์ฉํ๋ฉด ์ด๋ ๋ค!
<FlatList
onEndReached={fetchMoreUpcoming}
onEndReachedThreshold={0.5}
...
data={upcomingData.pages.map((page) => page.results).flat()}
renderItem={({ item }) => <UpcomingMovieItem movie={item} />}
keyExtractor={(item) => item.id}
...
/>
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ๋ฌดํ์คํฌ๋กค์ ์ ์ฉํด๋ณด์์ผ๋ ๋น์ทํ ์๋ฆฌ๋ก ๋ฆฌ์กํธ์์๋ ์ ์ฉํด๋ณผ ์ ์์ง ์์๊น ์ถ๋ค! ๐ค
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ReactNative] xml2js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก XML to JSON ํ๊ธฐ (0) | 2023.01.09 |
---|---|
[ReactNative] ์ค์ฒฉ ๋ผ์ฐํฐ ๋ค๋น๊ฒ์ด์ ์ง์ ํด์ ํ์ด์ง ์ด๋ (0) | 2023.01.06 |
[ReactNative] <FlatList> ์ <ScrollView> (0) | 2023.01.04 |
[ReactNative] useEffect์ useFocusEffect (0) | 2023.01.03 |
์ปค์คํ ํ ์ผ๋ก ํฌ๋๋ฆฌ์คํธ input ๋ฆฌํฉํ ๋งํ๊ธฐ (0) | 2023.01.02 |
Comment