[React Native] Navigation์ผ๋ก ํ๋ฉด ์ด๋ํ๊ธฐ (Navigation Between Screens)
์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ๋ค๋น๊ฒ์ด์ ์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฐ์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
์ธ์ด๋ TypeScript, ํ๊ฒฝ์ Expo๋ก ์งํ ํ๊ฒ ์ต๋๋ค!
Install
Native
npm install @react-navigation/native @react-navigation/native
Native-stack
npm install @react-navigation/native @react-navigation/native-stack
Safe-area-context
expo install react-native-screens react-native-safe-area-context
Navigation Initial Setting
App.tsx
์ด๊ธฐ ํ๋ฉด์ Navigation์ ํ๋ฉด์ผ๋ก ์ธํ ํด ์ค๋๋ค
import { StatusBar } from "expo-status-bar";
import Navigation from "./navigation";
export default function App() {
return (
<>
<Navigation />
<StatusBar style="auto" />
</>
);
}
Create two screens
์ด๋ํ ๋ ํ๋ฉด ScreenA, ScreenB๋ฅผ ๊ฐ ๋ง๋ค์ด ์ค๋๋ค.
ScreenA.tsx
import { View, Text, Button } from "react-native";
export default function ScreenA({ navigation }: any) {
return (
<View>
<Text>I am a screen A</Text>
<Button
title="Go to ScreenB"
onPress={() => navigation.navigate("ScreenB")}
/>
</View>
);
}
ScreenB.tsx
import { View, Text, Button } from "react-native";
export default function ScreenB({ navigation }: any) {
return (
<View>
<Text>I am a screen B</Text>
<Button
title="Go to ScreenA"
onPress={() => navigation.navigate("ScreenA")}
/>
</View>
);
}
Create a native stack navigator
๋ค์ด๊ฒ์ด์ ์ ๋ณด๋ฅผ Stack์ผ๋ก ๋ด์ ์ฝ๋๋ฅผ ์์ฑํด ์ค๋๋ค.
NavigationContainer: ๋ค๋น๊ฒ์ด์ ์คํ์ ๋ด๋ ๊ณต๊ฐ
Stack.Navigator:Screen์ ์คํ์ผ๋ก ๋ด์ ๊ณต๊ฐ
Stack.Screen:Stack์ผ๋ก ์์ Screen
index.tsx
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { NavigationContainer } from "@react-navigation/native";
import ScreenB from "../screens/ScreenB";
import ScreenA from "../screens/ScreenA";
const Stack = createNativeStackNavigator();
export default function Navigation() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="ScreenA">
<Stack.Screen name="ScreenA" component={ScreenA} />
<Stack.Screen name="ScreenB" component={ScreenB} />
</Stack.Navigator>
</NavigationContainer>
);
}
Test
Screen A ํ๋ฉด์์ Go to ScreenB ๋ฒํผ์ ๋๋ฅด๋ฉด Screen B ํ๋ฉด์ผ๋ก ์ด๋ํ๊ณ ,
Screen B ํ๋ฉด์์ Go to Screen A ๋ฒํผ์ ๋๋ฅด๋ฉด Screen A ํ๋ฉด์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
Resolution
๋ง์ฝ ์๋์ ๊ฐ์ด "'Stack.Navigator' cannot be used as a JSX component" ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด @types/react์ ๋ฒ์ ์ด ๋ฌ๋ผ์ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
package.json์ผ๋ก ์ด๋ํด์ resolution์ ์ถ๊ฐ ํด์ค ๋ค @types/react์ ๋ฒ์ ์ ๊ฐ์ฅ ์ต๊ทผ ๊ฒ์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
"resolutions": {
"@types/react": "17.0.43" //lastest version
},
๊ทธ ๋ค์ npm install์ ํด์ฃผ๊ณ ํ๋ก์ ํธ๋ฅผ ๊ป๋ค๊ฐ ๋ค์ ์ผ๋ฉด ์ค๋ฅ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ ๋๋ค.
npm install
๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ์๊ณ ์ถ๋ค๋ฉด ์๋ ์ฌ์ดํธ๋ก ์ด๋ํด์ ํ์ธํ์๋ฉด ๋ฉ๋๋ค.
Reference