๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฑ Cross Platform/React Native

[React Native] Navigation์œผ๋กœ ํ™”๋ฉด ์ด๋™ํ•˜๊ธฐ (Navigation Between Screens)

by Fomagran ๐Ÿ’ป 2022. 6. 16.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” 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

 

๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•ด์„œ ํ™•์ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

@types/react

TypeScript definitions for React. Latest version: 18.0.14, last published: 19 hours ago. Start using @types/react in your project by running `npm i @types/react`. There are 11736 other projects in the npm registry using @types/react.

www.npmjs.com


Reference

 

 

Navigating Between Screens · React Native

Mobile apps are rarely made up of a single screen. Managing the presentation of, and transition between, multiple screens is typically handled by what is known as a navigator.

reactnative.dev

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€