๐ 8์ฅ ๋ด๋น๊ฒ์ด์
๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋์ธ ๋ด๋น๊ฒ์ด์ ์ ๋ง๋ค์ด๋ณด์.
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ผํ๋ค.
npm install --save @react-navigation/native
๋ฆฌ์กํธ ๋ด๋น๊ฒ์ด์ ์ ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ๋ชจ๋์ด ๋ถ๋ฆฌ๋์ด ์์ด ์ดํ์๋ ์ฌ์ฉํ๋ ๋ด๋น๊ฒ์ด์ ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผํ๋ค.
1. ๋ฆฌ์กํธ ๋ค๋น๊ฒ์ด์
- ์คํ ๋ด๋น๊ฒ์ด์
- ํญ ๋ด๋น๊ฒ์ด์
- ๋๋ก์ด ๋ด๋น๊ฒ์ด์
๋ด๋น๊ฒ์ด์ ์ ๊ตฌ์กฐ
- Screen ์ปดํฌ๋ํธ : ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ
- name, component ์์ฑ์ ์ง์ ํด์ผํ๋ค.
- ํญ์ navigation๊ณผ route๊ฐ props๋ก ์ ๋ฌ๋๋ค.
- Navigation ์ปดํฌ๋ํธ : ํ๋ฉด์ ๊ด๋ฆฌํ๋ ์ค๊ฐ ๊ด๋ฆฌ์ ์ญํ
- ์ฌ๋ฌ ๊ฐ์ Screen ์ปดํฌ๋ํธ๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ๊ฐ๊ณ ์๋ค.
- NavigationContainer ์ปดํฌ๋ํธ : ๋ด๋น๊ฒ์ด์
์ ๊ณ์ธต ๊ตฌ์กฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํ
์ด๋ ์ญํ
- ๋ชจ๋ ๋ด๋น๊ฒ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ผ ์ต์์ ์ปดํฌ๋ํธ
์ค์ ์ฐ์ ์์
๋ฆฌ์กํธ ๋ด๋น์๊ธฐ์ ์์ ์ค์ ํ ์ ์๋ ๋ค์ํ ์์ฑ์ ์์ ํ๋ ๋ฐฉ๋ฒ
- Navigator ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก ์์
- ์์ ์ปดํฌ๋ํธ๋ก ์กด์ฌํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ์ฉ๋๋ค.
- ๋ชจ๋ ํ๋ฉด์ ๊ณตํต์ ์ผ๋ก ์ ์ฉํ๊ณ ์ถ์ ์์ฑ์ธ ๊ฒฝ์ฐ ์ด์ฉ
- Screen ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก ์์
- ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌ๋๋ navigation์ ์ด์ฉํด์ ์์
- ๊ฐ๋ณํ๋ฉด์๋ง ์ ์ฉ๋๋ ์์ฑ์ธ ๊ฒฝ์ฐ Screen ์ปดํฌ๋ํธ ํน์ ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์์ ์์
์์ ๋ฒ์์ ์ค์ ์ผ์๋ก ์ฐ์ ์์๊ฐ ๋์ผ๋ฏ๋ก, Screen ์ปดํฌ๋ํธ์ ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ ๋์ผํ ์ต์ ์ด ์ ์ฉ๋์๋ค๋ฉด ํ๋ฉด ์ปดํฌ๋ํธ์ ์ค์ ์ด ์ฐ์ ํ๋ค.
2. ์คํ ๋ด๋น๊ฒ์ด์
npm install @react-navigation/stack
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ด๋น๊ฒ์ด์
- ํ์ฌ ํ๋ฉด ์์ ๋ค๋ฅธ ํ๋ฉด์ ์์ผ๋ฉด์(push) ํ๋ฉด ์ด๋
- ์ด์ ํ๋ฉด์ ๊ณ์ ์ ์งํ๋ฏ๋ก, ๊ฐ์ฅ ์์ ํ๋ฉด์ ๋ค์ด๋ด๋ฉด(pop) ์ด์ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ค.
- ์ฌ๋ฌ ๋ชฉ๋ก ์ค ํน์ ํญ๋ชฉ์ ์์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ ๋ ๋ง์ด ์ฌ์ฉ
ํ๋ฉด ๊ตฌ์ฑ
src/Screens
- ์ฒซ ํ๋ฉด์ผ๋ก ์ฌ์ฉํ Home ํ๋ฉด ์์ฑ
const Home = () => {
return(
<Container>
<StyledText>Home</StyledText>
<Button title="go to the list screen" />
</Container>
);
};
export default Home;
- List ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋ ์ปดํฌ๋ํธ ์์ฑ : ํ๋ฉด์์ ์ฌ์ฉํ ์์ ๋ชฉ๋ก ์์ฑ ํ, ํญ๋ชฉ ์๋งํผ ๋ฒํผ์ ์์ฑ
- ๋ชฉ๋ก์ ์์ธ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ ์์ฑ
src/navigations
const Stack = createStackNavigator();
const StackNavigation = () => {
return(
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="List" component={List} />
<Stack.Screen name="Item" component={Item} />
</Stack.Navigator>
);
};
- createStackNavigator ํจ์๋ฅผ ์ด์ฉํด ์คํ ๋ด๋น๊ฒ์ด์ ์ ์์ฑ
- ์์ฑ๋ ์คํ ๋ด๋น๊ฒ์ด์ ์๋ ํ๋ฉด์ ๊ตฌ์ฑํ๋ Screen ์ปดํฌ๋ํธ์ Screen ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ Navigator ์ปดํฌ๋ํธ๊ฐ ์๋ค.
- Navigator ์ปดํฌ๋ํธ ์์ Screen ์ปดํฌ๋ํธ๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ์์ฑํ๊ณ , ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ Screen ์ปดํฌ๋ํธ์ component๋ก ์ง์ ํ๋ค.
src/App.js
const App = () => {
return (
<NavigationContainer>
<StackNavigation/>
</NavigationContainer>
);
};
NavigationContainer ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ์์ฑ๋ ์คํ ๋ด๋น๊ฒ์ด์ ์ ๊ฐ์ธ๋๋ก ํ๋ค.
→ ์ฒซ ๋ฒ์งธ๋ก ๋์ค๋ ํ๋ฉด์ Navigator ์ปดํฌ๋ํธ์ ์ฒซ๋ฒ์งธ ์์ Screen ์ปดํฌ๋ํธ์ด๋ค.
- ์ปดํฌ๋ํธ์ ์์ ๋ณ๊ฒฝ ๋๋ initialRouteName ์์ฑ์ ์ด์ฉํด ์ฒซ ๋ฒ์งธ ํ๋ฉด์ ์ง์ ํ ์ ์๋ค.
ํ๋ฉด ์ด๋
- Screen ์ปดํฌ๋ํธ์ component๋ก ์ง์ ๋ ์ปดํฌ๋ํธ๋ ํ๋ฉด์ผ๋ก ์ด์ฉ๋๊ณ navigation์ด props๋ก ์ ๋ฌ๋๋ค.
- navigate ํจ์ : ์ํ๋ ํ๋ฉด์ผ๋ก ์ด๋
Home ํ๋ฉด์์ props๋ก ์ ๋ฌ๋๋ navigation์ ์ฌ์ฉํด์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด List ํ๋ฉด์ผ๋ก ์ด๋ํ๋๋ก ํด๋ณด์.
const Home = ({ navigation }) => {
return(
<Container>
<StyledText>Home</StyledText>
<Button
title="go to the list screen"
onPress={() => navigation.navigate('List')}
/>
</Container>
);
};
- navigation์ ์๋ navigate ํจ์๋ฅผ ์ด์ฉํด์ ์ํ๋ ํ๋ฉด์ ์ด๋ฆ์ ์ ๋ฌํ๋ฉด ํด๋น ํ๋ฉด์ผ๋ก ์ด๋ํ๋ค.
- ์ ๋ฌ๋๋ ํ๋ฉด ์ด๋ฆ์ Screen ์ปดํฌ๋ํธ์ name ๊ฐ ์ค ํ๋๋ฅผ ์ ๋ ฅ
navigate ํจ์ ์ด์ฉ ์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ ์ด๋ํ๋ ํ๋ฉด์ ํ์ํ ์ ๋ณด๋ฅผ ํจ๊ป ์ ๋ฌ ํ ์ ์๋ค.
const List = ({ navigation }) => {
const _onPress = item => {
navigation.navigate('Item', { id: item._id, name: item.name });
};
Item ํ๋ฉด์ผ๋ก ์ด๋ํ๋ฉด์ ํญ๋ชฉ์ id์ name์ ํจ๊ป ์ ๋ฌํ๋๋ก ํ๋ค.
์ ๋ฌ๋ ๋ด์ฉ์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌ๋๋ route์ params๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํ๋ค.
const Item = ({ route }) => {
return(
<Container>
<StyledText>Item</StyledText>
<StyledText>Id: {route.params.id}</StyledText>
<StyledText>Name: {route.params.name}</StyledText>
</Container>
);
};
์ ๋ฌ๋ฐ์ params๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด์ id์ name์ ์ถ๋ ฅํ๋ค.
ํ๋ฉด ๋ฐฐ๊ฒฝ์ ์์ ํ๊ธฐ
src/screens/Home.js
const Container = styled.View`
background-color: #ffffff;
align-items: center;
`;
- ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ ์ฒด ์์ญ์ ์ฐจ์งํ๋๋ก ์คํ์ผ์ flex: 1 ์ ์ค์ ํ๋ค.
- ์ํฉ์ ๋ฐ๋ผ ํ๋ฉด ์ ์ฒด๋ฅผ ์ฐจ์งํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฆฌ์กํธ ๋ด๋น๊ฒ์ด์ ์ ์ค์ ์ ์์ ํ์ฌ ํด๊ฒฐํ๋ค.
-
const StackNavigation = () => { return( <Stack.Navigator initialRouteName="Home" screenOptions={{ cardStyle: {backgroundColor: '#ffffff'} }} >
- cardStyle์ ์ด์ฉํด ์คํ ๋ด๋น๊ฒ์ด์ ์ ํ๋ฉด ๋ฐฐ๊ฒฝ์ ์์ .
- ํ๋ฉด ๋ฐฐ๊ฒฝ์์ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ๊ฒ ์ฌ์ฉํ๋ฏ๋ก ํ๋ฉด๋ง๋ค ์ค์ ํ๊ธฐ๋ณด๋ค Navigation ์ปดํฌ๋ํธ์์ ์ค์ ํด ํ๋ฉด ์ ์ฒด์ ์ ์ฉ๋๋๋ก ํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.
- ํน์ ํ๋ฉด๋ง ๋ฐฐ๊ฒฝ์์ ๋ค๋ฅด๊ฒ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ Screen ์ปดํฌ๋ํธ์์ ์ค์ ํ๊ฑฐ๋ ํ๋ฉด์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์์ ์ง์ ๋ฐฐ๊ฒฝ์์ ์ง์ ํ๋ค.
ํค๋ ์์ ํ๊ธฐ
์คํ ๋ด๋น๊ฒ์ด์ ์ ํค๋๋ ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ์ ๊ณตํ๊ฑฐ๋ ํ์ดํ์ ํตํด ํ์ฌ ํ๋ฉด์ ์๋ ค์ค๋ค.
ํ์ดํ ์์
- Screen ์ปดํฌ๋ํธ์ name ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ → name์ ์์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฝ๊ฒ ํ์ดํ ๋ณ๊ฒฝํ๋ ๋ฒ.
- name ๊ฐ ๋ณ๊ฒฝ ์ navigate ํจ์์ ์ ๋ฌํ๋ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๊ฐ๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
-
const List = ({ navigation }) => { const _onPress = item => { navigation.navigate('Detail', { id: item._id, name: item.name }); };
- name ์์ฑ์ ์ด์ฉํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ์ ์์ ํด์ผํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ headerTitle ์์ฑ์ ์ด์ฉํ๋ ๋ฒ์ด ์๋ค.
const StackNavigation = () => {
return(
<Stack.Navigator
initialRouteName="Home"
screenOptions={{ cardStyle: {backgroundColor: '#ffffff'} }}
>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen
name="List"
component={List}
options={{ headerTitle: 'List Screen' }}
/>
<Stack.Screen name="Detail" component={Item} />
</Stack.Navigator>
);
};
๊ฐ๋ณ ํ๋ฉด์ ์์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ Screen ์ปดํฌ๋ํธ์ options๋ฅผ ์ด์ฉํ๋ค.
๋ชจ๋ ํ๋ฉด์์ ๊ฐ์ ํ์ดํ์ด ๋ํ๋๋๋ก ์์ ํ๊ณ ์ถ์ผ๋ฉด Navigator ์ปดํฌ๋ํธ์ screenOptions ์์ฑ์ headerTitle์ ์ง์ ํ๋ค.
์คํ์ผ ์์
- headerStyle : ํค๋์ ๋ฐฐ๊ฒฝ์ ๋ฑ์ ์์
- headerTitleStyle : ํค๋์ ํ์ดํ ์ปดํฌ๋ํธ์ ์คํ์ผ ์์
const StackNavigation = () => {
return(
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
cardStyle: {backgroundColor: '#ffffff'},
headerStyle: {
height: 110,
backgroundColor: '#95a5a6',
borderBottomWidth: 5,
borderBottomColor: '#34495e',
},
headerTitleStyle: { color: '#ffffff', fontSize: 24 },
headerTitleAlign: 'center',
}}
>
</Stack.Navigator>
);
};
๋ชจ๋ ํ๋ซํผ์์ ํ์ดํ์ ๋์ผํ๊ฒ ์ ๋ ฌํ๊ธฐ ์ํด์๋ headerTitleAlign ์์ฑ์ ์ง์ ํ๋ค.
ํ์ดํ ์ปดํฌ๋ํธ ๋ณ๊ฒฝ
ํ์ดํ์ ๋ฌธ์์ด์ด ์๋ ๋ค๋ฅธ ๊ฒ์ ๋ ๋๋งํ๊ธฐ ์ํด์ headerTitle ์์ฑ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ง์ ํ๋ค.
- style๊ณผ tintColor๋ฅผ ํฌํจํ ๊ฐ์ฒด๊ฐ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ.
- style : headerTitleStyle์ ์ค์ ๋ ๊ฐ
- tintColor : headerTintColor์ ์ง์ ๋ ๊ฐ
const StackNavigation = () => {
return(
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
...
headerTitleStyle: { color: '#ffffff', fontSize: 24 },
headerTitleAlign: 'center',
headerTitle: ({ style }) => (
<MaterialCommunityIcons name="react" style={style} />
),
}}
- ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ style์ ์ด์ฉํ์ฌ headerTitleStyle์ ์ง์ ํ ์คํ์ผ๊ณผ ๋์ผํ ์คํ์ผ์ด ์ ์ฉ๋๋๋กํ๋ค.
- ๋ฐํ๋๋ ์ปดํฌ๋ํธ๋ vector-icons์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ๋ฆฌ์กํธ ๋ก๊ณ ๊ฐ ๋ ๋๋ง๋๋๋ก ํ๋ค.
๋ฒํผ ์์ ํ๊ธฐ
์ด์ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ ํค๋ ์ผ์ชฝ์ ์๋ ๋ฒํผ์ ์์ ํด๋ณด์.
<Stack.Screen
name="List"
component={List}
options={{
headerTitle: 'List Screen',
headerBackTitleVisible: true,
headerBackTitle: 'Prev',
}}
/>
- iOS์ ์๋๋ก์ด๋ ํ๋ซํผ ๋ฒํผ ํ์ดํ ๋ ๋๋ง ์ฌ๋ถ๋ฅผ ๋์ผํ๊ฒ ์ค์ ํ๊ธฐ ์ํด headerBackTitleVisible์ ์ด์ฉํ ์ ์๋ค.
- ๋ฒํผ์ ํ์ดํ์ ์ด์ ํ๋ฉด์ ์ด๋ฆ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ ์ด์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ headerBackTitle ์ ์ด์ฉํ๋ค.
๋ฒํผ ์คํ์ผ ์์ ํ๊ธฐ
headerBackTitleStyle์ ์ด์ฉํด ๋ฒํผ ํ์ดํ์ ์คํ์ผ์ ์ง์ ํ ์ ์๋ค.
๋ฒํผ์ ํ์ดํ๊ณผ ์ด๋ฏธ์ง ์์ ๋์ผํ๊ฒ ๋ณ๊ฒฝํ๋ ค๋ฉด headerTintColor๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
<Stack.Screen
name="List"
component={List}
options={{
headerTitle: 'List Screen',
headerBackTitleVisible: true,
headerBackTitle: 'Prev',
headerTitleStyle: { fontSize: 24 },
headerTintColor: '#e74c3c',
}}
/>
๋ฒํผ ์ปดํฌ๋ํธ ๋ณ๊ฒฝ
๋ ํ๋ซํผ์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ์์ด์ฝ์ ๋์ผํ ์์ด์ฝ์ด ๋ ๋๋ง๋๋๋ก ํ๊ธฐ ์ํด headerBackImage์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ ๋ฌํด ๋ ํ๋ซํผ์ด ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋งํ๋๋ก ํด๋ณด์.
<Stack.Screen
name="List"
component={List}
options={{
...
headerBackImage: ({ tintColor }) => {
const style = {
marginRight: 5,
marginLeft: Platform.OS === 'ios'? 11 : 0,
};
return(
<MaterialCommunityIcons
name="keyboard-backspace"
size={30}
color={tintColor}
style={style}
/>
);
},
}}
/>
headerBackImage์ ํจ์ ํ๋ผ๋ฏธํฐ์ ์ ๋ฌ๋๋ tintColor ๊ฐ์ ์ด์ฉํด ์์ด์ฝ์ ์์ ์ง์ ํ๊ณ , ๋ ํ๋ซํผ์ ๋ฒํผ ์์น๋ฅผ ๋์ผํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํ๋ซํผ์ ๋ฐ๋ผ ์คํ์ผ์ ๋ค๋ฅด๊ฒ ์ ์ฉํ๋ค.
- useLayoutEffect Hook ๋ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋ ์งํ ํ๋ฉด์ด ๋ ๋๋ง๋๊ธฐ ์ ์ ์คํ๋๋ค.
- headerLeft, headerRight์ ๊ฐ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ง์ ํ๋ค.
- navigation์์ ์ ๊ณตํ๋ popToTop ํจ์๋ ํ์ฌ ์์ฌ์๋ ๋ชจ๋ ํ๋ฉด์ ๋ด๋ณด๋ด๊ณ ์ฒซ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ ๊ธฐ๋ฅ์ด๋ค.
ํค๋ ๊ฐ์ถ๊ธฐ
headerMode๋ headerShown์ ์ฌ์ฉํ์ฌ ํค๋๋ฅผ ๊ฐ์ถฐ๋ณด์.
headerMode
- float : ํค๋๊ฐ ์๋จ์ ์ ์ง๋๋ฉฐ ํ๋์ ํค๋๋ฅผ ์ฌ์ฉํ๋ค.
- screen : ๊ฐ ํ๋ฉด๋ง๋ค ํค๋๋ฅผ ๊ฐ์ง๋ฉฐ ํ๋ฉด ๋ณ๊ฒฝ๊ณผ ํจ๊ป ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง๋ค.
- none : ํค๋๊ฐ ๋ ๋๋ง๋์ง ์๋๋ค.
<Stack.Screen
name="Home"
component={Home}
ooptions={{ headerShown: false }}
/>
headerShown ์ ํ๋ฉด ์ต์ ์ผ๋ก, Navigator ์ปดํฌ๋ํธ์ screenOptions์ ์ค์ ํ๋ฉด ์ ์ฒด ํ๋ฉด์ ํค๋๊ฐ ๋ณด์ด์ง ์๋๋ก ์ค์ ํ ์ ์๋ค.
3. ํญ ๋ด๋น๊ฒ์ด์
- ํ๋ฉด ์๋ ์๋์ ์์นํ๋ฉฐ, ํญ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฒํผ๊ณผ ์ฐ๊ฒฐ๋ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ค.
- ํญ ๋ด๋น๊ฒ์ด์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
npm install @react-navigation/bottom-tabs
ํ๋ฉด ๊ตฌ์ฑ
src/navigations/Tab.js
const Tab = createBottomTabNavigator();
const TabNavigation = () => {
return(
<Tab.Navigator initialRouteName="Settings">
<Tab.Screen name="Mail" component={Mail} />
<Tab.Screen name="Meet" component={Meet} />
<Tab.Screen name="Settings" component={Settings} />
</Tab.Navigator>
);
};
- createBottomTabNavigator ํจ์๋ฅผ ์ด์ฉํด ํญ ๋ด๋น๊ฒ์ด์ ์ ์์ฑ
- ํญ ๋ฐ์ ์๋ ๋ฒํผ ์์๋ Navigator ์ปดํฌ๋ํธ์ ์์์ผ๋ก ์๋ Screen ์ปดํฌ๋ํธ์ ์์์ ๋์ผํ๋ค.
- ํญ ๋ฒํผ์ ์์๋ฅผ ์ ์งํ ์ฑ ๋ ๋๋ง๋๋ ์ฒซ ํ๋ฉด์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ initialRouteName ์์ฑ์ ์ด์ฉํ๋ค.
ํญ ๋ฐ ์์ ํ๊ธฐ
๋ฒํผ ์์ด์ฝ ์ค์
- tabBarIcon์ ์ด์ฉํด ํญ ๋ฒํผ์ ์์ด์ฝ์ ๋ ๋๋งํ๋ค.
- tabBarIcon์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ง์ ํ๋ฉด ๋ฒํผ์ ์์ด์ฝ์ด ๋ค์ด๊ฐ ์๋ฆฌ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
const TabIcon = ({ name, size, color }) => {
return <MaterialCommunityIcons name={name} size={size} color={color} />;
};
const Tab = createBottomTabNavigator();
const TabNavigation = () => {
return(
<Tab.Navigator initialRouteName="Settings">
<Tab.Screen
name="Mail"
component={Mail}
options={{
tabBarIcon: props => TabIcon({ ...props, name: 'email '}),
}}
/>
<Tab.Screen
name="Meet"
component={Meet}
options={{
tabBarIcon: props => TabIcon({ ...props, name: 'video' }),
}}
/>
<Tab.Screen
name="Settings"
component={Settings}
options={{
tabBarIcon: props => TabIcon({ ...props, name: 'settings' }),
}}
/>
</Tab.Navigator>
);
};
- ํ๋ฉด์ ๊ตฌ์ฑํ๋ Screen ์ปดํฌ๋ํธ๋ง๋ค tabBarIcon์ MaterialCommunityIcons ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ง์ ํ๋ค.
- ๋ง์ฝ Screen ์ปดํฌ๋ํธ๋ง๋ค ํญ ๋ฒํผ ์์ด์ฝ์ ์ง์ ํ์ง ์๊ณ ํ๊ณณ์์ ๋ชจ๋ ๋ฒํผ์ ์์ด์ฝ์ ๊ด๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ Navigator ์ปดํฌ๋ํธ์ screenOptions ์์ฑ์ ์ฌ์ฉํด์ ๊ด๋ฆฌํ ์ ์๋ค.
const TabNavigation = () => {
return(
<Tab.Navigator
initialRouteName="Settings"
screenOptions={({ route }) => ({
tabBarIcon: props => {
let name = '';
if(route.name === 'Mail') name = 'email';
else if (route.name === 'Meet') name = 'video';
else name = 'settings';
return TabIcon({ ...props, name });
},
})}
>
<Tab.Screen name="Mail" component={Mail} />
<Tab.Screen name="Meet" component={Meet} />
<Tab.Screen name="Settings" component={Settings} />
</Tab.Navigator>
);
};
- screenOptions์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ค์ ํ๊ณ ํจ์๋ก ์ ๋ฌ๋๋ route๋ฅผ ์ด์ฉํ๋ค.
๋ผ๋ฒจ ์์
๋ฒํผ ์๋์ ๋ ๋๋ง๋๋ ๋ผ๋ฒจ์ Screen ์ปดํฌ๋ํธ์ name๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
const TabNavigation = () => {
return(
<Tab.Navigator
initialRouteName="Settings"
tabBarOptions={{ labelPosition: 'beside-icon', showLabel: false }}
>
<Tab.Screen
name="Mail"
component={Mail}
options={{
tabBarLabel: 'Inbox',
tabBarIcon: props => TabIcon({ ...props, name: 'email '}),
}}
/>
- ๋ผ๋ฒจ์ tabBarLabel์ ์ด์ฉํด ๋ณ๊ฒฝํ ์ ์๋ค.
- labelPosition์ ์ค์ ํ์ฌ ๋ผ๋ฒจ์ ๋ฒํผ ์์ด์ฝ์ ์๋๊ฐ ์๋ ์์ด์ฝ ์์ ๋ ๋๋ง๋๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
- showLabel์ ์ด์ฉํด ํญ ๋ฐ์์ ๋ผ๋ฒจ์ด ๋ ๋๋ง๋์ง ์๋๋ก ์ค์ ํ ์ ์๋ค.
์คํ์ผ ์์
ํญ ๋ฐ์ ๋ฐฐ๊ฒฝ์์ ์์ ํด๋ณด์.
const TabNavigation = () => {
return (
<Tab.Navigator
initialRouteName="Settings"
tabBarOptions={{
labelPosition: 'beside-icon',
showLabel: false,
style: {
backgroundColor: '#54b7f9',
borderTopColor: '#ffffff',
borderTopWidth: 2,
},
activeTintColor: '#ffffff',
inactiveTintColor: '#cfcfcf',
}}
>
- ํญ ๋ฐ์ ์คํ์ผ์ tabBarOptions ์์ฑ์ style์ ๊ฐ์ผ๋ก ์คํ์ผ ๊ฐ์ฒด๋ฅผ ์ค์ ํด ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
- ํญ ๋ฒํผ์ ์์ด์ฝ ์์ ๊ฐ๊ฐ activeTintColor์ inactiveTintColor๋ฅผ ์ด์ฉํด ์ค์ ๊ฐ๋ฅํ๋ค.
const TabNavigation = () => {
return(
<Tab.Navigator
initialRouteName="Settings"
tabBarOptions={{
labelPosition: 'beside-icon',
showLabel: false,
style: {
backgroundColor: '#54b7f9',
borderTopColor: '#ffffff',
borderTopWidth: 2,
},
activeTintColor: '#ffffff',
inactiveTintColor: '#cfcfcf',
}}
>
<Tab.Screen
name="Mail"
component={Mail}
options={{
tabBarLabel: 'Inbox',
tabBarIcon: props =>
TabIcon({
...props,
name: props.focused ? 'email' : 'email-outline',
}),
}}
/>
...
- ์์ด์ฝ์ ์ค์ ํ๊ธฐ ์ํด ํ๋ผ๋ฏธํฐ๋ก size, color, focused๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋๋ค.
- ์ด ๊ฐ์ ์ด์ฉํด ๋ฒํผ์ ํ์ฑํ ์ํ์ ๋ฐ๋ฅธ ๋ค๋ฅธ ๋ฒํผ์ ๋ ๋๋งํ๊ฑฐ๋ ์คํ์ผ๋ง์ ๋ณ๊ฒฝํ๋ค.
- focused์ ๊ฐ์ ๋ฐ๋ผ ๋ฒํผ์ด ํ์ฑํ ๋์์ ๋ ๋ด๋ถ๊ฐ ์ฑ์์ง ์ด๋ฏธ์ง๊ฐ ๋ ๋๋ง๋๋ค.
- ๋นํ์ฑํ ์ํ์์๋ ๋ด๋ถ๊ฐ ๋น ์์ด์ฝ์ด ๋ ๋๋ง๋๋ค.
๋ด๋น๊ฒ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ๋ฏธ๋ฆฌ ๊ณํ์ ์ธ์ฐ๋ ๊ฒ์ด ์ข๋ค.
๋ฆฌ์กํธ ๋ด๋น๊ฒ์ด์ ์๋ ์ฌ๋ฌ๊ฐ์ง ์ข ๋ฅ์ ๋ด๋น๊ฒ์ด์ ์ด ์์ผ๋ฏ๋ก ๋ค์ํ๊ฒ ์ฌ์ฉํด๋ณด๊ณ ํ์ํ ๊ธฐ๋ฅ์ ํ์ฉํ๋๋ก ํ์.
'3-1๊ธฐ ์คํฐ๋ > React Native' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[4์ฃผ์ฐจ] Hooks์ Context API (0) | 2021.11.17 |
---|---|
[3์ฃผ์ฐจ] ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก โ TODO List ๋ง๋ค๊ธฐ (0) | 2021.11.08 |
[2์ฃผ์ฐจ] 4์ฅ ์คํ์ผ๋ง (0) | 2021.11.08 |
[1์ฃผ์ฐจ] ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ ์ปดํฌ๋ํธ (1์ฅ~3์ฅ) (0) | 2021.10.15 |
๋๊ธ