React Native - React Navigation

2026. 1. 21. 17:22ยท๐Ÿ›ธ React Native

React Native

 

 

โœ… React Navigation


React Navigation

 

React Navigation์€ React Native์—์„œ ํ™”๋ฉด ์ด๋™(๋„ค๋น„๊ฒŒ์ด์…˜)์„ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์•ฑ์˜ “ํ™”๋ฉด ์Šคํƒ”, “ํƒญ”, “์„œ๋ž ๋ฉ”๋‰ด”, “๋”ฅ๋งํฌ”, “์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜” ๊ฐ™์€ ๊ฑธ ํ‘œ์ค€์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

React Navigation์ด ํ•ด์ฃผ๋Š” ๊ฒƒ

  • Stack Navigation: A → B → C์ฒ˜๋Ÿผ ํ™”๋ฉด์„ ์Œ“์•„๊ฐ€๋ฉฐ ์ด๋™ (๋’ค๋กœ๊ฐ€๊ธฐ ํฌํ•จ)
  • Tab Navigation: ํ•˜๋‹จ ํƒญ(ํ™ˆ/๊ฒ€์ƒ‰/๋งˆ์ดํŽ˜์ด์ง€ ๊ฐ™์€)
  • Drawer Navigation: ์˜†์—์„œ ๋‚˜์˜ค๋Š” ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด
  • Nested Navigation: ํƒญ ์•ˆ์— ์Šคํƒ, ์Šคํƒ ์•ˆ์— ํƒญ ๊ฐ™์€ ์กฐํ•ฉ
  • Params ์ „๋‹ฌ: navigate("Detail", { id }) ์ฒ˜๋Ÿผ ํ™”๋ฉด ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • Deep Linking: myapp://detail/123 ๊ฐ™์€ ๋งํฌ๋กœ ํŠน์ • ํ™”๋ฉด ์—ด๊ธฐ

 

โœ… Bottom Tabs Navigator


https://reactnavigation.org/docs/bottom-tab-navigator?config=dynamic

 

Bottom Tabs Navigator | React Navigation

A simple tab bar on the bottom of the screen that lets you switch between different routes. Routes are lazily initialized -- their screen components are not mounted until they are first focused.

reactnavigation.org

 

Navigator(stack or tab)๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด NavigationContainer๋ฅผ ๋จผ์ € ๋ Œ๋”๋ง ํ•ด์•ผ ํ•œ๋‹ค.

(appํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Expo Router๋ฉด ํ•„์š”์—†๋‹ค.)

 

Tab.Navigator prop

screenOptions: ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค ์„ค์ • ๊ฐ€๋Šฅ
(๋ชจ๋“  Screen์— ๊ฐ™์€ ์„ค์ •์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด)

export default function Tabs() {
  return (
    <Tab.Navigator
      initialRouteName="Movies"
      screenOptions={{
        tabBarLabelStyle: {
          backgroundColor: "red",
        },
      }}
    >
      <Tab.Screen name="Movies" component={Movies}></Tab.Screen>
      <Tab.Screen name="Tv" component={Tv}></Tab.Screen>
      <Tab.Screen name="Search" component={Search}></Tab.Screen>
    </Tab.Navigator>
  );
}

 

๊ฐ Screen์— ์„ค์ •์„ ๋”ฐ๋กœ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฐ Screen์˜ options prop์„ ์‚ฌ์šฉ.

      <Tab.Screen
        name="Tv"
        component={Tv}
        options={{
          tabBarLabelStyle: {
            backgroundColor: "purple",
          },
        }}
      ></Tab.Screen>

 

tabBarIcon

Function that given { focused: boolean, color: string, size: number } returns a React.Node, to display in the tab bar.

      <Tab.Screen
        name="Movies"
        component={Movies}
        options={{
          tabBarIcon: ({focused, color, size }) => (
            <Ionicons name="film-outline" color={color} size={size} />
          ),
        }}
      />

 

 

https://reactnavigation.org/docs/bottom-tab-navigator#options

 

Bottom Tabs Navigator | React Navigation

A simple tab bar on the bottom of the screen that lets you switch between different routes. Routes are lazily initialized -- their screen components are not mounted until they are first focused.

reactnavigation.org

 

 

โœ… Stack Navigator


Stack vs Native Stack

Stack Navigator๋Š” React Navigation์— ์žˆ๋Š” ๊ฒƒ์ด๊ณ , javascript๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ.

(๊ฐ Platform์˜ navigation์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. Native๋กœ ๊ตฌํ˜„๋œ navigation๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์„ ์ˆ˜ ์žˆ์Œ)

 

Native Stack Navigator๋Š” Native API๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ ๊ฒƒ.

createNativeStackNavigator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ navigator๋ฅผ ๋งŒ๋“ค๋ฉด native๋กœ ๋งŒ๋“  ์ผ๋ฐ˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ณ , ํผํฌ๋จผ์Šค๋„ ๋˜‘๊ฐ™๋‹ค.

(๋Œ€์‹  ์ปค์Šคํ…€ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด ์กฐ๊ธˆ ์ค„์–ด๋“ ๋‹ค.)

(๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” Native๋ฅผ ์ถ”์ฒœ)

npm install @react-navigation/native-stack

or

npx expo install @react-navigation/native-stack

๐Ÿ“Œ expo install์„ ์“ฐ๋Š” ์ด์œ 

ํ˜„์žฌ Expo SDK ๋ฒ„์ „์— ๋งž๋Š” ๋ฒ„์ „ ์ž๋™ ์„ ํƒ

iOS/Android ๋„ค์ดํ‹ฐ๋ธŒ ์˜์กด์„ฑ ํ˜ธํ™˜ ๋ณด์žฅ

 

Usage

import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { Text, View } from "react-native";

const NativeStack = createNativeStackNavigator();

const ScreenOne = () => (
  <View>
    <Text>One</Text>
  </View>
);
const ScreenTwo = () => (
  <View>
    <Text>Two</Text>
  </View>
);
const ScreenThree = () => (
  <View>
    <Text>Three</Text>
  </View>
);

export default function Stack() {
  return (
    <NativeStack.Navigator>
      <NativeStack.Screen name="One" component={ScreenOne} />
      <NativeStack.Screen name="Two" component={ScreenTwo} />
      <NativeStack.Screen name="Three" component={ScreenThree} />
    </NativeStack.Navigator>
  );
}

 

 

Navigation prop reference

navigate

const ScreenOne = ({ navigation: { navigate } }: any) => (
  <TouchableOpacity onPress={() => navigate("Two")}>
    <Text>Go to Two</Text>
  </TouchableOpacity>
);
const ScreenTwo = ({ navigation: { navigate } }: any) => (
  <TouchableOpacity onPress={() => navigate("Three")}>
    <Text>Go to Three</Text>
  </TouchableOpacity>
);
const ScreenThree = ({ navigation: { goBack } }: any) => (
  <TouchableOpacity onPress={() => goBack()}>
    <Text>Go Back</Text>
  </TouchableOpacity>
);

 

 

Stack.Navigator props

animation

ํ”Œ๋žซํผ์˜ animation ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. iOS์—์„œ๋Š” flip๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

 

headerBackTitleVisible: false -> headerBackButtonDisplayMode: "minimal"

๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์— ์ œ๋ชฉ์„ ์—†์• ๋Š” ์†์„ฑ ์ด๋ฆ„์ด ๋ฐ”๋€œ(iOS only)

 

 

โœ… Stack navigator์™€ Tab navigator ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ


๋จผ์ € Root Stack navigator๋ฅผ ๋งŒ๋“ค๊ณ  Tabs์™€ Stack์„ Screen์œผ๋กœ ๋ Œ๋”๋ง ํ•œ๋‹ค.

import { createNativeStackNavigator } from "@react-navigation/native-stack";
import Stack from "./Stack";
import Tabs from "./Tabs";

const Nav = createNativeStackNavigator();

export default function Root() {
  return (
    <Nav.Navigator screenOptions={{ headerShown: false }}>
      <Nav.Screen name="Tabs" component={Tabs} />
      <Nav.Screen name="Stack" component={Stack} />
    </Nav.Navigator>
  );
}

 

๊ทธ๋ฆฌ๊ณ  Tabs ๋‚ด์˜ Movies component์—์„œ props๋กœ navigation๋‚ด์˜ navigate์™€ TouchableOpacity๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํฌ๋ฆฐ์ด ๋ˆŒ๋ ธ์„ ๋•Œ, Stack ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ Three Screen์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ.

import { Text, TouchableOpacity } from "react-native";

export default function Movies({ navigation: { navigate } }: any) {
  return (
    <TouchableOpacity
      onPress={() => navigate("Three")}
      style={{ flex: 1, alignItems: "center", justifyContent: "center" }}
    >
      <Text>Movies</Text>
    </TouchableOpacity>
  );
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ๋ฐœ์ƒ The action 'NAVIGATE' with payload {"name":"Three"} was not handled by any navigator.

์„œ๋กœ ๋‹ค๋ฅธ Navigator(Stack๊ณผ Tab) ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๋จผ์ € Stack navigator์— ๊ฐ€์„œ ๊ทธ ๋‹ค์Œ Three Screen์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ ์–ด์ค˜์•ผ ํ•จ.

import { Text, TouchableOpacity } from "react-native";

export default function Movies({ navigation: { navigate } }: any) {
  return (
    <TouchableOpacity
      onPress={() => navigate("Stack", { screen: "Three" })}
      style={{ flex: 1, alignItems: "center", justifyContent: "center" }}
    >
      <Text>Movies</Text>
    </TouchableOpacity>
  );
}

ํŠน์ • ํ™”๋ฉด์— ๋“ค์–ด๊ฐ€์„œ Stack navigator๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Tab navigator๊ฐ€ ๋ณด์ด์ง€ ์•Š์•˜์œผ๋ฉด ํ•  ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

(๋ณดํ†ต ์ด๋ ‡๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉ)

 

Stack์—์„œ๋งŒ modal์„ ์‚ฌ์šฉํ•˜๊ณ  Search screen์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ๋Š” modal๋กœ ์—ด๋ฆฐ stack์„ ๋‹ซ๊ณ  ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•

<Root.tsx>

export default function Root() {
  return (
    <Nav.Navigator screenOptions={{ headerShown: false }}>
      <Nav.Screen name="Tabs" component={Tabs} />
      <Nav.Screen
        name="Stack"
        component={Stack}
        options={{ presentation: "modal" }}
      />
    </Nav.Navigator>
  );
}

 

<Stack.tsx>

const ScreenThree = ({ navigation }: any) => (
  <TouchableOpacity
    onPress={() => {
      const parent = navigation.getParent();
      parent.goBack();
      requestAnimationFrame(() => {
        parent.navigate("Tabs", { screen: "Search" });
      });
    }}
  >
    <Text>Go to Search</Text>
  </TouchableOpacity>
);

navigation.goBack()์€ “ํ˜„์žฌ Stack ์•ˆ์—์„œ๋งŒ ๋’ค๋กœ ๊ฐ€๋Š” ๊ฒƒ”์ด๊ณ 
navigation.getParent().goBack()์€ “modal๋กœ ์—ด๋ฆฐ Stack ์ž์ฒด๋ฅผ ๋‹ซ๋Š” ๊ฒƒ”์ด๋‹ค.
์ง€๊ธˆ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ parent๋ฅผ ์จ์•ผ ํ•œ๋‹ค.

 

requestAnimationFrame์ด ํ•„์š”ํ•œ ์ด์œ 
• v7์—์„œ๋Š” modal dismiss ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— navigateํ•˜๋ฉด
• ์—ฌ์ „ํžˆ “modal ์ปจํ…์ŠคํŠธ”๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
• ํ•œ ํ”„๋ ˆ์ž„ ๋Šฆ์ถ”๋ฉด ์•ˆ์ •์ ์œผ๋กœ ๋ถ„๋ฆฌ๋จ

'๐Ÿ›ธ React Native' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React Native - Dark Mode  (0) 2026.01.26
React Native - npx expo prebuild, ๊ธฐ๊ธฐ ๋ฌด์„  ์—ฐ๊ฒฐ ๋ชจ๋‹ˆํ„ฐ๋ง  (0) 2026.01.21
React Native - 26.01.20 ๊ธฐ์ค€ ์ตœ์‹  Components, API  (0) 2026.01.20
React Native - Android Studio & Xcode ํ™˜๊ฒฝ ์„ธํŒ…(m2 macOS)  (0) 2026.01.20
React Native - ๋ฐฐํฌํ•˜๊ธฐ  (0) 2026.01.19
'๐Ÿ›ธ React Native' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • React Native - Dark Mode
  • React Native - npx expo prebuild, ๊ธฐ๊ธฐ ๋ฌด์„  ์—ฐ๊ฒฐ ๋ชจ๋‹ˆํ„ฐ๋ง
  • React Native - 26.01.20 ๊ธฐ์ค€ ์ตœ์‹  Components, API
  • React Native - Android Studio & Xcode ํ™˜๊ฒฝ ์„ธํŒ…(m2 macOS)
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    next.js 14
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    Firebase
    SQL
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    Next.js
    MySQL
    tailwindcss
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    React Native
    react router
    API
    0๋ ˆ๋ฒจ
    ๋ชจ๋”ฅ๋‹ค
    PostgreSQL
    Python
    Prisma
    dev setup
    next.js 12
    mongoDB
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
React Native - React Navigation
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”