react native cli๋ก ๋น๋ํด์ expo๋ก install์ ํด๋ ๋์ง๋ง npm์ด๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ค.
npm install @react-navigation/native
npm install react-native-screens react-native-safe-area-context
๊ณต์ ๋ฌธ์ (https://reactnavigation.org/docs/getting-started/) ๋ฅผ ๋ณด๋ฉด ์ ์ค๋ช ๋์ด์๋ค!
Mac์์ IOS ๋น๋๋ฅผ ์ํ ๋ฌด์ธ๊ฐ๋ฅผ ์ค์นํด์ผํ๋๋ฐ ๋๋ ํด๋น์ฌํญ์ด ์์ด์ ์คํต!
1. NavigationContainer
์์ navigator๋ฅผ ๊ฐ์ธ๋ ์ ์ด์ฃผ๋ container๋ฅผ ์จ์ค์ผํ๋ค.
navigator์ ๋ํด์ ์ธ ์ ์๋ props๋ค์ด ์๋๋ฐ ๋์ค์ ๋คํฌ๋ชจ๋, ๋ผ์ดํธ๋ชจ๋ ๋ง๋ค๋๋ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ค.
import { NavigationContainer } from '@react-navigation/native';
export default function App() {
return (
<NavigationContainer>
....
</NavigationContainer>
);
}
2. Navigator
๋ค์ํ navigators๊ฐ ์๋๋ฐ ๊ฐ ๊ฐ์ ๊ฑฐ์ฌ๋ ios, android๋ง๋ค ๋ํดํธ ์์ง์์ด ๋ค๋ฅด๊ธฐ๋ํ๊ณ , ์ถ๊ฐํ ์ ์๋ ์ด๋ฒคํธ๊ฐ ๋ค๋ฅด๋ค. ios๊ฐ ํ์คํ ๋ ๋ค์ํ๋ค. ใ ใ ... ํฌํก.. ์ผ๋์ฐ ์ฐ๋ ๋ ๋ ๊ฐ์...
bottom tabs ์ native stack ์ ํจ๊ป ์จ๋ณผ๊ฒ์ด๋ค!
โพ bottom tabs
๋ง๊ทธ๋๋ก ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ์๋์ชฝ์ ๊ณ ์ ๋์ด์๋ tab menu์ ๋ปํ๋ค. ํญ์ ์๋ ๋ฉ๋ด๋ฅผ ๋๋ฅด๋ฉด ํด๋น ํ์ด์ง๋ก ๋ฐ๋ก๋ฐ๋ก ์ด๋ํ ์ ์๊ฒ ๋์์ค๋ค!
์ค์นํ๊ธฐ
npm install @react-navigation/bottom-tabs
๋จผ์ ์ ์ธํด์ tab์ ๋ง๋ค์ด์ค๋ค. ์๋์ฒ๋ผ ๋ง๋ค์ด์ฃผ๋ฉด Home, Settings ๋ผ๋ ๋ฉ๋ด๊ฐ ๋๊ฐ ๋ง๋ค์ด์ง๋ค. ํด๋ฆญ์ ํ๋ฉด ๋ค์ ๋ถ์ด์๋ component๋ก ์ด๋ํ๋ ๊ฒ์ด๋ค!
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}
style ์ ํ๊ธฐ
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Tab.Navigator
screenOptions={{
tabBarStyle: {backgroundColor:"#1e272e"} ,
tabBarActiveTintColor:"gold",
headerStyle:{ backgroundColor: "#1e272e" },
headerTitleStyle : {color: "black"},
tabBarLabelStyle: { fontSize: 12, fontWeight:"600"}
}}>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}
screenOptions ๋ผ๋ Props๋ฅผ ์ธ ์ ์๋๋ฐ, ๊ทธ ์์ ๋ค์ด๊ฐ์๋ ์ต์ ๋ค์ด ๋ค์ํ๋ค. tabBarStyle๋ฅผ ์จ์ ๋ฐฐ๊ฒฝ์์ ๋ฐ๊ฟ ์๋ ์๊ณ , ํ ์คํธ ์์์ ๋ณ๊ฒฝํ๋ ๋ฏ css์ ์ธ๋ถ๋ถ๋ ์์ ํ ์ ์๋ค. ์ญ์๋ ๊ณต์๋ฌธ์์ ์ ๋์์๋ค.
โพ Stack vs Native Stack
์ปดํฌ๋ํธ ์์ ์๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ ๋์์ ๋ฉ๋ด๋ ๋ง๋ค ์ ์๋ค. ์ฝ๊ฒ ๋งํ์๋ฉด ์คํฌ๋ฆฐ๊ณผ ์๋ก์ด ์คํฌ๋ฆฐ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์์ชฝ์ ์๋ ๋ฉ๋ด์ด๋ค. stack ๊ณผ native stack ๋๊ฐ์ง๊ฐ ์๋๋ฐ ๋ ๊ฐ์ง๊ฐ ๋์์ ๋น์ทํ๋ฐ ์ด์ง ๋ค๋ฅด๋ค.
๋ํดํธ ๊ฐ์ด๋ผ๊ณ ํ ์ ์๋ stack์ด ์๋๋ฐ, ios์ android ๋ ๊ฐ์ง ๋ชจ๋์๊ฒ ์ ์ฌํ ๋ฃฉ ์ค ํ์ ์ ์ฌํด์ฃผ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ์ผ๋ก ์ ๋๋ฉ์ด์ ์ ์ปค์คํ ๋ง์ด์งํ ์ ์์ด ์์ ๋๊ฐ ๋์ ํธ์ด๋ค. ios๋ android์์ ์ ๊ณตํ๋ navigation์ ์ฐ๋๊ฒ ์๋๋ผ๋ ๋ง์ด๋ค. ๊ทธ๋์ native๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง์๋ ์๋ค๊ณ ๋งํ๋ค.
native stack์ ๋ชจ๋ฐ์ผ๋ฟ ์๋๋ผ web์์๋ ๋ฒ ์ด์งํ ๋ชจ์ต์ ์ ๊ณตํด์ค๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํฐ ์ ๋ชฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ์ง๋ง stack๋งํผ ์ปค์คํฐ๋ง์ด์ง์ ํ ์ ์๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค. ์๋ ์ด๊ฑด ios๋ android๊ฐ ์ ๊ณตํ๋ navigator๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
native stack ์ค์นํ๊ธฐ
npm install @react-navigation/native-stack
์๋์ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ์ ํ ์ ์๋ค.
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
function MyStack() {
return (
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Settings" component={Settings} />
</Stack.Navigator>
);
}
stack๋ฉ๋ด์์ ์ด๋ป๊ฒ ์ด๋์ ํ๋๋ฉด! ์ด ๋ Navigation prop ์ด๋ผ๋ ๊ฒ์ด ๋์จ๋ค.(ํด๋ฆญํ๋ฉด ๊ณต์๋ฌธ์๋ก ์ด๋)
nativgation์ด๋ผ๋ ๊ฒ์ด๋ค. props๋ฅผ ์ด์ฉํด์ ์คํฌ๋ฆฐ์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์๊ฒ ํด์ค๋ค! ๋ญ๊ฐ ๋๋ ์ด๋์ด ์ฌ์๋ณด์ด๋ ์ด ๋๋~~~! Home์ด๋ผ๋ ์คํฌ๋ฆฐ์ ๋ง๋ค์ด์ฃผ๊ณ ๊ทธ ์์ "์ ํ ์ผ๋ก ๊ฐ๊ธฐ" ๋ผ๋ ํ ์คํธ๋ฅผ ๋ฃ์ด์ค๋ค!!
Home์ด๋ผ๋ ์คํฌ๋ฆฐ์ ๋ฌ "์ ํ ์ผ๋ก ๊ฐ๊ธฐ"๋ฅผ ๋๋ฅด๋ฉด Setting ์คํฌ๋ฆฐ์ผ๋ก ์ด๋ํ๊ณ ์์ชฝ์ ๋ค๋ก๊ฐ๊ธฐ ์์ด์ฝ์ด ๋ฐ๊ฒ๋๋ค. ๊ทธ๊ฑธ ๋๋ฅด๋ฉด ๋ค์ Home์ผ๋ก ๊ฐ์์๋ค! ์ ๋ ์นด!!
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { Text, TouchableOpacity} from "react-native"
const Stack = createNativeStackNavigator();
const Home = ({navigation: { navigate}}) =>
<TouchableOpacity onPress={() => navigate("Setting")}>
<Text>์
ํ
์ผ๋ก ๊ฐ๊ธฐ</Text>
</TouchableOpacity>
function MyStack() {
return (
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Settings" component={Settings} />
</Stack.Navigator>
);
}
navigation์์ navigate๋ฅผ ์ผ๋๋ฐ, ์ด๊ฑด ๋ค๋ฅธ ์คํฌ๋ฆฐ์ผ๋ก ์ด๋ํ๊ฒ ๋์์ค๋ค. goBack ์ด๋ผ๋ ๊ฒ๋ ์๋๋ฐ ์ด๊ฑด ๋ง๊ทธ๋๋ก ๋ค๋ก๊ฐ๊ธฐ์ด๋ค. ์ด ์ธ์๋ ๋ค์ํ prop๊ฐ ์๋ค!
๐ ๋๊ผฌ์ค์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํด์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค!
'๊ฐ๋ฐ > React-Native' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(ios) EAS๋ก expo ๋น๋ํ๊ณ testFlight์ ๋ฑ๋กํ๊ธฐ (feat.์ค๋ฅ) (0) | 2024.11.22 |
---|---|
[react-native] weekly calendar ๋ฃ์ด๋ณด๊ธฐ (0) | 2024.10.31 |
[React Native] React Nativgation ์ ์ฉํ๊ธฐ - 2 (0) | 2022.03.16 |
[React Native] AppLoading (0) | 2022.02.28 |
[React-Native] ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์์ํ๊ธฐ( with Expo) (0) | 2022.02.21 |