
React Native Navigation : ์ธ๊ตญ ๊ฐ๋ฐ์์ ๋ง์ด ์ฐ์
ํ์ ์ค์น
npm install @react-navigation/native
expo์ธ ๊ฒฝ์ฐ:npx expo install react-native-screens react-native-safe-area-context
npm install @react-navigation/native-stack: ์๋ก์ด ๋ทฐ๊ฐ ์์ด๋๋ก ์ฌ๋ผ์ค๋ ๋ค๋น๊ฒ์ด์
// In App.js in a new project
import * as React from 'react';
import { View, Text } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
function HomeScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
</View>
);
}
const Stack = createNativeStackNavigator();
function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
export default App;
<NavigationContainer>: ์ฑ์์ ๋ณดํต ํ๋๋ง ์ฌ์ฉ, ๋ค ๊ฐ์ธ๋ ํํ
<Navigator>: ์ฌ๋ฌ ๊ฐ๊ฐ ๋ง๋ค์ด์ง ์ ์์, ์ฌ๋ฌ ๊ฐ๊ฐ ๋ชจ์ฌ์ ํ๋์ ์ฑ์ ๋ง๋ฆ
(์ฉ๋ ๋ณ๋ก ๋๋์ด์) ์์๋ ์ฌ๋ฌ ๊ฐ์<Screen>
<Stack>์๋name๊ณผcomponent๊ฐ ๋ค์ด๊ฐ
๊ฐ component๋ props๋กprops->props.navigation๋๋{navigation}์ ๋ฐ์: ํ์ฌ ํ์ด์ง์ ๋ํ ์ ๋ณด + ๋ด๊ฐ ์์ผ๋ก ํ ์ ์๋ ํ๋๋ค๋ ๋ค์ด์ค๊ฒ ๋จ
function Hone({navigation}) {
return (
<>
<Button
title="๋ก๋ ๋ฒํธ ์์ฑ๊ธฐ"
onPress={() => {
navigation.navigate('LottoGenerator');
}}
/>
</>
);
}
`' ios: ์ข์ฐ, ์๋๋ก์ด๋: ์ํ๋ก ์์ฌ ์๋ ๊ฒ, ์๋ ํ๋ฉด์ด ๋ค๋ก ๊ฐ๊ณ ์์ ์์ด๋ ๊ฒ
๊ธฐ๋ณธ๊ฐ: header(๋ค๋ก ๊ฐ๋ ๋ฒํผ)
๊ธฐ๋ณธ View๋ scroll์ด ๋์ง ์์
ScrollView: List Component๊ฐ ์๋ ๊ฒฝ์ฐ:
<ScrollView>
<FlatList
data={DATA} //์ด๋ค ๋ฐ์ดํฐ?
renderItem={renderItem} //์ด๋ค ํํ
๋ก ๊ทธ๋ฆด ๊ฒ์ธ์ง์ ๋ํ ํจ์
keyExtractor={item => item.id} //item์ key๋ฅผ ์ด๋ค ๊ฒ์ผ๋ก ์ธ ์ง
/>
dataset์๋ ํญ์ key๊ฐ ํ์!! > ์ด๋ค ๊ฒ์ธ์ง ๊ตฌ๋ถํ ์ ์๋๋ก
const screenList = [
{key:1, title: "๋ก๋ ๋ฒํธ ์์ฑ๊ธฐ", link: "LottoGenerator"},
{key:2, title: "์์ฐํ๊ฒฝ์๊ณ", link: "WatchFace"},
]
function Home({navigation}) {
function renderItem({item}){
return <Button title={props.item.title}
onPress={()=>{navigation.navigate(item.link);
}}/>
} //ํจ์ ์์ ํจ์-> rendering์ด ํ๋ฉด์ด ๋ฐ๋ ๋๋ง๋ค ์์ ํจ์๋ ๊ฐ์ด ๋จ
return (
<>
<FlatList data={screenList} renderItem={renderItem}/>
</>
);
}
react์์ useCallback()์ ์ ์ธํด์ด(useState ์ฒ๋ผ)
const screenList = [
{key:1, title: "๋ก๋ ๋ฒํธ ์์ฑ๊ธฐ", link: "LottoGenerator"},
{key:2, title: "์์ฐํ๊ฒฝ์๊ณ", link: "WatchFace"},
]
function Home({navigation}) {
const renderItem = useCallback(({item}) => {
return <Button title={item.title}
onPress={() =>{navigation.navigate(item.link);
}}/>
}, [] );
return (
<>
<FlatList data={screenList}
renderItem={renderItem}
keyExtractor={item => item.key}/>
</>
);
}
์ด๋ฏธ์ง, ๋ณธ๋ฌธ ์์ ํ ์คํธ ๋ฑ, ๋ฒํผ UI-> ์คํ์ผ๋ก ์ง์ ๋ UI
ios, ์๋๋ก์ด๋๊ฐ ๊ฐ๋๋ก ๊ณ ์ ์ UI ๋์์ธ์ ์ง์ ํ ๋ฒํผ์ ๋ง๋ค ๋ ์ฌ์ฉ
const LinkItem = styled.View`
padding: 8px 12px;
border-bottom: 1px solid #e5e5e5;
`;
function Home({navigation}) {
const renderItem = useCallback(({item}) => {
return (
<Pressable onPress={() => navigation.navigate(item.link)}>
<LinkItem>
<Text>{item.title}</Text>
</LinkItem>
</Pressable>
)
}, [] );