2024. 11. 15. 21:54ใStudy_Develop/React Native
์๋ ํ์ธ์!
์ค๋์ React Native์ ScrollView์ FlatList์ ์ฐจ์ด์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋๋ฐ์!
์ ์ ํ๋ก์ ํธ์๋ ๋๊ฐ์ง๊ฐ ์ ์ ํ๊ฒ ์ ํ๋์ด ์ฌ์ฉํ๊ณ ์์ด์.
(์๋ง๋?? ใ ใ ใ ....)
๋ ๊ฐ์ง ์ปดํฌ๋ํธ๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์ฝํ ์ธ ๋ฅผ ํ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ
์คํฌ๋กค ๊ฐ๋ฅํ ์์ดํ ์ ๊ฐ์ธ๋ ์ปดํ ์ด๋ ์ญํ ์ ํ๋ฉฐ, ์์ ์ปดํฌ๋ํธ๋ค์ด ๋ชจ๋ ํด๋น ์ปดํฌ๋ํธ ์์์ ๋ ๋๋ง์ด ๋ผ์!
๊ธฐ๋ณธ์ ์ผ๋ก ์์ง ์คํฌ๋กค์ ์ง์ํ์ง๋ง, horizontal ์์ฑ์ ํตํด ์ํ ์คํฌ๋กค๋ ์ง์ํ๋ต๋๋ค!
์ด๋ ๊ฒ ๋น์ทํ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ธ๋ฐ,
์ด๋ค ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์ด๋ค ์ํฉ์ ์ด๋ป๊ฒ ์ ์ ํ๊ฒ ์ฐ๋์ง ์ง๊ณ ๋์ด๊ฐ๋ฉด
ํ๋ก์ ํธ์ ๋์ฑ ๋ ๋์ ๋์ค ๊ฑฐ์์ ~~โค๏ธโค๏ธ
ScrollView ์ ์ฐ์
ScrollView ๋ ํ๋ฉด ์๊ด์์ด ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ ๋ ๋๋ง ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐ์์์ผ์
๊ทธ๋ฌ๋ฏ๋ก ํ๋ฉด์ ๋ฒ์ด๋๋ ๊ธด ํ ์คํธ, ๊ฐ์๊ฐ ํ์ ๋ ๋ฆฌ์คํธ ๋ฑ์ ์ ํฉํด์.
์ ๋ ๊ทธ๋์ ์ด ์ปดํฌ๋ํธ๋ฅผ ํ์๊ฐ์ ํ๋ฉด, ๊ธ ์์ฑํ๋ฉด์ ์ฌ์ฉํ์์ด์.
์๋ํ๋ฉด,
ํ์๊ฐ์ ์ด๋ ํ๋กํ ํ๋ฉด, ๊ธ ์์ฑ ํ๋ฉด ๋ฑ๋ฑ์
์ฝํ ์ธ ๊ฐ ๋ฐ๋ณต๋์ง ์๊ฑฐ๋ ๋์ ๋ฐ์ดํฐ ๋ ๋๋ง์ด ํ์ํ์ง ์์์์.
์ด๋ฐ ํ๋ฉด์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ช ๊ฐ์ง ์์ ํ๋, ์ ์ ํ ์คํธ ๋ฐ ์ผ๋ถ ์ด๋ฏธ์ง๊ฐ ์๊ฑฐ๋
๊ณ ์ ๋ ์์ ์ ๋ณด ๊ทธ๋ฆฌ๊ณ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์
ํด๋น ํ๋ฉด์ ๊ตฌํํ ๋ ScrollView๋ฅผ ์ฌ์ฉํ์๋ต๋๋ค.
์ด๋ฐ์์ผ๋ฃจ์!
์ด๋ ๊ฒ ๋ฐ๋ณต๋์ง ์๊ณ ๊ณ ์ ๋ ์์ ๋ฐ์ดํฐ๋ค์
ScrollView๋ฅผ ์ด์ฉํ์๋ต๋๋ค.
ํนํ header๋ footer ๋ชจ๋ ํ๋์ ์คํฌ๋กค์ ๋ฐฐ์นํด์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด
ScrollView๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ์ ํ์ด ๋ ๊ฒ ๊ฐ์์!
FlatList ์ ์ฐ์
FlatList๋ ScrollVIew์ ๋ฌ๋ฆฌ ๋ชจ๋ ์์๋ฅผ ํ๊บผ๋ฒ์ ๋ ๋๋ง ํ์ง ์๊ณ , ํ์ฌ ํ๋ฉด์ ๋ ๋๋ง ๋ ์์๋ง ๋ ๋๋ง์ ํด์ค๋๋ค.
์ฒซ ํ๋ฉด์์ ํด๋น ํ๋ฉด๋งํผ์ ์์ดํ ์ด ๋ ๋๋ง์ด ๋๊ณ , ์ฌ์ฉ์๊ฐ ์๋๋ก ์ค์์ดํ ํจ์ ๋ฐ๋ผ ๋ ๋ง์ ์์ดํ ๋ค์
๋ ๋๋ง ํ๊ฒ ํด ์ค์!
๋ญ๊ฐ ์ฑํ ์ด๋ ๋๊ฒ ๋ง์ ๋ฐ์ดํฐ๋ค์ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ง ์๋์~~??
์ค์ ๋ก ๊ธธ๊ณ ๋์ ์ธ ํญ๋ชฉ ๋ชฉ๋ก์ ํ์ํ๋ ํ๋ฉด์ FlatList๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
ํนํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ๋ฐ๋ณต ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋์ฑ FlatList๋ฅผ ์ฌ์ฉํด ์ฃผ๋ฉด ์ข์์!
์ ๋ ํผ๋ ํน์ ๋ฉ์์ง ๋ชฉ๋ก, ์ฌ์ฉ์ ๋ฆฌ์คํธ ๋ชฉ๋ก ๋ฑ๋ฑ ๋์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ํฐ ๋ฐ์ดํฐ ํญ๋ชฉ๋ค์
FlatList๋ก ํํํด ์ฃผ์์ด์.
์ด๋ฐ ๋ฐ์ดํฐ ๋ค์ด์!
๋ฐ์ดํฐ๋ค์ด ๋์ ์ผ๋ก ๋ง์ด ์์ฑ๋์์์.
๊ทธ๋ฌ๋ ์ผ๋จ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋จผ์ ๋ก๋ํ๊ณ ์คํฌ๋กคํ ๋ ๋์ ์ผ๋ก ๋ก๋/์ธ๋ก๋ ํ์ฌ
๋ ๋๋ง์ ๋์ฑ ์ต์ ํํด์ฃผ์์ต๋๋ค.
๋ฐ๋ผ์ FlatList๊ฐ ScrollView๋ณด๋ค ์ฑ๋ฅ๋ฉด์์๋ ๋ฐ์ด๋๊ฒ ์ฃ ?
๊ทธ๋์์ธ์ง ์ฝ๋ ๊ตฌํ๋ ์กฐ๊ธ ๋ณต์กํด์ ใ ใ
ํ์ง๋ง ์ดํดํ๊ณ ๋ณด๋ฉด ํ ๋งํ๋ค๋ ๊ฑฐ!
FlatList ๊ตฌํํด ๋ณด๊ธฐ / FlatList Props ์ข ๋ฅ
FlatList๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ ๋๋ง ํ์ง ์๊ณ ํ๋ฉด์ ๋ณด์ด๋ ๋ถ๋ถ or ์ค์ ํ ๊ฐ์๋งํผ ๋ง ๋ณด์ด๊ฒ ๋๋ค.
๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋ณํ ์ ์๊ณ , ๋ฐ์ดํฐ์ ์์ ๋ชจ๋ฅผ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ ์ปดํฌ๋ํธ
๋ ๋๋ง ์ด๊ธฐ์๋ ์ ์ ํ ์์ ๋ฐ์ดํฐ๋ง ๋ ๋๋ง ํ ๋ค, ์ ์ ์ ์ํธ์์ฉ์ ์ํด Scroll์ด ์์ง์ผ ๋ ํ์ํ ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ๋ ๋๋ง ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ข ๋ ํฅ์๋จ
์์ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ ํ๋ซ๋ฆฌ์คํธ!
const [posts, setPosts] = useState([]);
const fetchPosts = async (isInitialLoad = false) => {
try {
const response = await Client.users.getBoard();
setPosts(response.data);
} catch (error) {
... ๋ค๋ฅธ ์ฝ๋๋ค
}
};
const renderPost = ({item}) => {
return (
<TouchableOpacity
... ๋ค๋ฅธ ์ฝ๋๋ค
</TouchableOpacity>
);
};
<FlatList
data={posts}
renderItem={renderPost}
keyExtractor={(item) => item.id}
contentContainerStyle={HomeStyle.listContent}
refreshControl={
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
}
/>
๋ฉ์ธ ํ๋ฉด๋จ์์ ๊ตฌํํ ์ฝ๋์ ๋๋ค.
FlatList์ props๋ฅผ ์ดํด๋ด ์๋ค!
- data : ๋ง๋ค๊ณ ์ ํ๋ ๋ฆฌ์คํธ์ source๋ฅผ ๋ด๋ props์ ๋๋ค.
fetchPost์์ ๋ฉ์ธ ํ๋ฉด์ ๋ฟ๋ ค์ง๋ ๋ฐ์ดํฐ๋ค์ posts์ ๋ด์์ด์.
- renderItem : 1๊ฐ์ item์ render ์ํค๋ props์ ๋๋ค. item์ด๋ผ๊ณ ์ด๋ฆ ์ง๋ ๊ฒ์ ์ฝ์๋ ์ปจ๋ฒค์ ์ด์์!
- keyExtractor : ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ ํค๋ฅผ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉํด์! ์ด๋ react native์ ๋ ๋๋ง์ ์ต์ ํํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ ํ์์ ์ ๋๋ค! (์ ๋๋ก ์ ํด์ฃผ๋ฉด key์ค๋ณต ์๋์ด๋ ์๋ฌ๊ฐ ์์ฒญ ๋ ์.. ์ด ๋ถ๋ถ ์ ์ง์ ํด ์ฃผ์ธ์)
์ ์ฝ๋์์
keyExtractor={item => item.id}
๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ id๋ฅผ ์ง์ ํด์ฃผ๊ณ ์์ฃ
๊ฐ๊ฐ ์์ ์ ์ธ ์๋ณ์๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํด ์ฃผ๋ ๋ถ๋ถ์ ๋๋ค!
์ฑ๋ฅ์ ๋์ฑ ํฅ์ํ๊ณ ๋ชฉ๋ก์ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ ๋ ๋ถ์ ์ ํ ๋ค์ ๋ ๋๋ง ๋๋ ui ๊ฒฐํจ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค!
- refreshControl : ๋น๊ฒจ์ ์๋ก ๊ณ ์นจ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ์์ด์
+) ์ถ๊ฐ ์์๋๋ฉด ๋์ ๋๋ props๋ค
- onEndReachedThreshold : ๋ชฉ๋ก์ ๊ฐ์ฅ ๋ง์ง๋ง ์์ดํ ์ ์ด๋ ๋์ด์ ๋๋ฌ ์ onEndReached์ด ์ํ๋๋์ง ์ง์ ( ๊ฐ : 0~1, ๋์์๋ก ๋นจ๋ฆฌ onEndReached๊ฐ ์ํ)
- onEndReached : ์คํฌ๋กค์ด ๋ชฉ๋ก์ ํ๋จ์ ๋๋ฌํ ์ ์ก์ ์ง์
- ListHeaderComponent : ๋ชฉ๋ก์ ์๋จ, ํญ๋ชฉ ์์ ๋ ๋๋ง ํ ๊ตฌ์ฑ์์ ์ ๋๋ค. ์ด๋ ํค๋, ์ ๋ชฉ ๋๋ ๊ธฐํ ์๊ฐ ์ฝํ ์ธ ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํด์!
- ListFooterComponent : ๋ชจ๋ ํญ๋ชฉ ๋ค ๋ชฉ๋ก ํ๋จ์ ๋ ๋๋งํ ์ ์์ด์.
- initialNumToRender : ์คํฌ๋กคํ๊ธฐ ์ ์ ์ฒ์ ๋ ๋๋ง ํ ํญ๋ชฉ ์์ ๋๋ค. ์ด๋ ๋ชฉ๋ก์ด ํด ๋ ์ฑ๋ฅ์ ์ต์ ํํ๋๋ฐ ์ ์ฉํด์
- maxToRenderPerBatch : ํ ๋ฐฐ์น๋ก ๋ ๋๋ง ํ ์ต๋ ํญ๋ชฉ ์์ ๋๋ค. ์ด๋ ์ฑ๋ฅ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ๋ฒ์ ๋ ๋๋ง ๋๋ ํญ๋ชฉ ์๋ฅผ ์ ์ดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- horizontal : true๋ก ์ค์ ํ ๊ฒฝ์ฐ ์ธ๋ก๊ฐ ์๋ ๊ฐ๋ก๋ก ์คํฌ๋กค๋ฉ๋๋ค.
- extraData : ๋ชฉ๋ก์ด ๋ณ๊ฒฝ๋ ๋ ๋ชฉ๋ก์ ๋ค์ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ ์ถ๊ฐ ๋ฐ์ดํฐ์ ๋๋ค.
- listEmptyComponent : data ๋ฐฐ์ด์ด ๋น์ด ์์ ๋ ๋ ๋๋งํ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํด์!
- ItemSeparatorComponent : ๋ชฉ๋ก์ ํญ๋ชฉ ์ฌ์ด์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ๋ ๋๋ง ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ์ฑ ์์์ ๋๋ค.
๋ชฉ๋ก ํญ๋ชฉ ์ฌ์ด์ ์ค์ด๋ ๊ฐ๊ฒฉ์ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉํด์!
- onRefresh : ์ฌ์ฉ์๊ฐ ๋ชฉ๋ก์ ์๋ก ๊ณ ์น๊ธฐ ์ํด ๋น๊ธธ ๋ ํธ๋ฆฌ๊ฑฐ ๋ฉ๋๋ค.
- scrollEnabled : ๋ชฉ๋ก ์คํฌ๋กค์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค.
false๋ก ์ค์ ํ๋ฉด ๋ชฉ๋ก์ ์คํฌ๋กคํ ์ ์์ต๋๋ค.
์ ์ฉํ props๋ค์ด ์ ๋ง ๋ง์ฃ !
์ด props๋ก ์ ๋ง ๋ง์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ ์์ด์
๋์ ํ๋ก์ ํธ ํ๋ฉด์ ์ฑ๊ฒฉ์ ๋ง๊ฒ
์ ์ ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ค ์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ฉ์๋น~~ ๐คฉ๐คฉโค๏ธโค๏ธ๐๐โญโญ๐๐
๊ทธ๋ผ 20000..