React Native ์ฑ์ ๋ง๋ค๋ค ๋ณด๋ฉด
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ๋ฉด์ ๋ฟ๋ ค์ผ ํ๋ ์ํฉ์ด ์ ๋ง ๋ง๋ค.
๊ทธ๋ด ๋ ํ์ํ ๊ธฐ๋ณธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค:
fetch
, axios
๋ฑ)useState
, useEffect
)FlatList
)์ด๋ฒ ๊ธ์์๋ ์ 3๊ฐ์ง ์์๋ฅผ ํ์ฉํด์
"๋ด์ค ๋ฆฌ์คํธ๋ฅผ ๋ถ๋ฌ์ค๋ ์์ "๋ฅผ ํตํด ์ค์ ์ฒ๋ผ ์ ๋ฆฌํด๋ดค๋ค.
import { useEffect, useState } from 'react';
import { FlatList, View, Text, ActivityIndicator } from 'react-native';
useEffect
: ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ API ์์ฒญuseState
: ๋ก๋ฉ ์ํ, ๋ฐ์ดํฐ ์ํ ์ ์ฅFlatList
: ๋ฆฌ์คํธ ๋ ๋๋ง ์ต์ ํ ์ปดํฌ๋ํธfunction NewsList() {
const [articles, setArticles] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
fetch('https://example.com/api/news')
.then(res => res.json())
.then(data => {
setArticles(data.articles);
setIsLoading(false);
})
.catch(err => {
console.error(err);
setIsLoading(false);
});
}, []);
if (isLoading) {
return <ActivityIndicator size="large" />;
}
return (
<FlatList
data={articles}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={{ padding: 12 }}>
<Text style={{ fontSize: 16 }}>{item.title}</Text>
</View>
)}
/>
);
}
ScrollView
๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ ๋๋งFlatList
๋ ํ๋ฉด์ ๋ณด์ด๋ ๋ฐ์ดํฐ๋ง ๋ ๋๋งํด์ ์ฑ๋ฅ์ด ํจ์ฌ ์ข์data
, renderItem
, keyExtractor
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
ActivityIndicator | ๋ก๋ฉ ์ํ ์ฒ๋ฆฌ์ ์ ์ฉ |
error state ์ถ๊ฐ | ์๋ฒ ์ค๋ฅ, ๋คํธ์ํฌ ๋ฌธ์ ์ ์ฒ๋ฆฌ |
useCallback ์ฌ์ฉ | ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ |
axios | fetch๋ณด๋ค ์ค๋ฅ ์ฒ๋ฆฌ, ์ธํฐ์ ํฐ ๋ฑ ํธ๋ฆฌํจ |
useEffect(() => {...}, [])
์์๋ง ํธ์ถ[]
๋ฃ๋ ๊ฑธ ์์ง ๋ง๊ธฐ!์น์์๋ fetch, React Query ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ํจ์นญ์ ํด๋ดค์ง๋ง,
React Native์์ FlatList๋ผ๋ ๊ตฌ์กฐ ๋๋ถ์
๋ ๋๋ง ์ฑ๋ฅ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ ๊ฑธ ์ฒ์ ๋๊ผ๋ค.
์ง๊ธ์ ์ํ๋ useState
, ๋ฐ์ดํฐ๋ FlatList
,
๋น๋๊ธฐ๋ useEffect
๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ ๊ฑธ ๊ธฐ๋ณธ ํ๋ฆ์ผ๋ก ์ผ๊ณ ์๋ค.
๐ โ๋ชจ๋ฐ์ผ์์ ๋ฐ์ดํฐ ํจ์นญ์ ๋จ์ํ ๋ถ๋ฌ์ค๋ ๊ฒ ์๋๋ผ, ํจ์จ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ธฐ์ ์ด๋ค.โ