React Navigation v7 Teljes Útmutató (2026): Stack, Tab és Drawer TypeScript-tel

Tanuld meg a React Navigation v7 használatát TypeScript-tel: Stack, Tab és Drawer navigátorok, statikus API, beágyazott navigátorok, deep linking és hitelesítési folyam — kód példákkal, Expo SDK 55 és React Native 0.76+ kompatibilitással.

React Navigation v7 TypeScript Útmutató

Mi az a React Navigation v7 és miért válaszd?

A React Navigation a legszélesebb körben használt navigációs könyvtár React Native alkalmazásokhoz — és őszintén szólva, nem véletlenül. A 2024 novemberében kiadott 7.0-s verzió fundamentális újításokat hozott: bevezette a statikus API-t, amellyel a TypeScript típusok és a deep linking konfiguráció automatikusan generálható a navigációs struktúrából. Ez megszünteti az egyik legnagyobb fejlesztői fájdalompontot: a navigációs konfiguráció és a típusdefiníciók kézi szinkronizálását. (Ha ez valaha is fájt neked, tudod, miről beszélek.)

A React Navigation v7 alapértelmezés szerint natív alsó lapokat kínál iOS-en és Androidon, integrálja a react-native-screens könyvtárat a teljesítmény maximalizálása érdekében, és teljes mértékben kompatibilis a React Native Új Architektúrájával. Ha Expo SDK 55-öt vagy React Native 0.76+-t használsz, ez a verzió a de facto szabvány. Szóval, vágjunk bele!

Telepítés és alapkonfiguráció

Először is, telepítsük a szükséges csomagokat. Expo projekthez ez elég egyszerű:

npx expo install @react-navigation/native @react-navigation/native-stack
npx expo install react-native-screens react-native-safe-area-context

Alap React Native projekthez (0.76+):

npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context

Fontos lépés: csomagold be az alkalmazás gyökerét a SafeAreaProvider-be, és engedélyezd a natív képernyőket:

import { enableScreens } from 'react-native-screens';
import { SafeAreaProvider } from 'react-native-safe-area-context';

enableScreens();

export default function App() {
  return (
    <SafeAreaProvider>
      <Navigation />
    </SafeAreaProvider>
  );
}

Az enableScreens() hívással a háttérben lévő képernyők valódi natív nézetekké válnak, amelyek 0% CPU-t és minimális memóriát fogyasztanak. Ez különösen fontos komplex navigációs struktúráknál — és hidd el, ez a különbség a gyors és a lassú app között.

Statikus API vs Dinamikus API

A React Navigation v7 két API-t kínál — és ez az egyik pont, ahol érdemes megállni egy percre.

A dinamikus API az előző verziókból ismert, ahol a navigátorokat React komponensként definiálod JSX-ben. A statikus API az újabb, ajánlott megközelítés, ahol a navigációs struktúrát konfigurációs objektumban definiálod. Ennek fő előnye: a TypeScript típusok és a deep linking konfiguráció automatikusan generálódik — nem kell manuálisan karbantartani őket. Nézzük, hogyan néz ez ki a gyakorlatban.

Stack Navigátor TypeScript-tel (Static API)

A stack (verem) navigátor a legalapvetőbb navigációs minta: az új képernyők egymásra kerülnek, mint egy kártyapakli. Legtöbb React Native app itt kezdi.

import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { createStaticNavigation } from '@react-navigation/native';
import type { StaticParamList, StaticScreenProps } from '@react-navigation/native';

// Képernyő komponensek
type HomeProps = StaticScreenProps<undefined>;
type ProfileProps = StaticScreenProps<{ userId: string; name: string }>;

function HomeScreen({ navigation }: HomeProps) {
  return (
    <Button
      title="Profil megtekintése"
      onPress={() => navigation.navigate('Profile', { userId: '42', name: 'Kovács Péter' })}
    />
  );
}

function ProfileScreen({ route }: ProfileProps) {
  const { userId, name } = route.params;
  return <Text>{name} (ID: {userId})</Text>;
}

// Navigátor definíció
const RootStack = createNativeStackNavigator({
  screenOptions: {
    animation: 'slide_from_right',
    headerBackButtonMenuEnabled: false,
  },
  screens: {
    Home: {
      screen: HomeScreen,
      options: { title: 'Főoldal' },
    },
    Profile: {
      screen: ProfileScreen,
      options: ({ route }) => ({ title: route.params.name }),
    },
  },
});

// Globális típusok — egyszer definiálod, mindenhol elérhető
declare global {
  namespace ReactNavigation {
    interface RootParamList extends StaticParamList<typeof RootStack> {}
  }
}

export const Navigation = createStaticNavigation(RootStack);

A StaticParamList automatikusan kinyeri a paramétertípusokat a konfigurációból. Ezután a useNavigation() hook típusbiztos lesz az egész alkalmazásban — anélkül, hogy minden komponensben manuálisan kellene megadni a típusokat. Ez önmagában megér egy verziófrisítést.

Tab Navigátor (Alsó Lapok)

Az alsó lapok navigátor a leggyakoribb mobil navigációs minta. Szinte minden fogyasztói app tartalmaz ilyet. Telepítsd a csomagot:

npm install @react-navigation/bottom-tabs

Teljes konfiguráció ikonokkal:

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Ionicons from '@expo/vector-icons/Ionicons';

const TabNavigator = createBottomTabNavigator({
  screenOptions: ({ route }) => ({
    tabBarIcon: ({ focused, color, size }) => {
      const icons: Record<string, string> = {
        Home: focused ? 'home' : 'home-outline',
        Search: focused ? 'search' : 'search-outline',
        Profile: focused ? 'person' : 'person-outline',
      };
      return <Ionicons name={icons[route.name] as any} size={size} color={color} />;
    },
    tabBarActiveTintColor: '#6200ee',
    tabBarInactiveTintColor: 'gray',
    tabBarStyle: { paddingBottom: 4 },
  }),
  screens: {
    Home: { screen: HomeScreen, options: { title: 'Kezdőlap' } },
    Search: { screen: SearchScreen, options: { title: 'Keresés' } },
    Profile: { screen: ProfileScreen, options: { title: 'Profil' } },
  },
});

Native Bottom Tabs — Platformhű megjelenés

A React Navigation v7 egyik legjelentősebb újítása a natív alsó lapok támogatása. iOS-en a SwiftUI TabView, Androidon a BottomNavigationView natív komponenseket használja — ez azt jelenti, hogy az alkalmazás pontosan úgy néz ki, ahogy az operációs rendszer elvárja.

npm install react-native-bottom-tabs
import { createNativeBottomTabNavigator } from 'react-native-bottom-tabs';

const NativeTabNavigator = createNativeBottomTabNavigator({
  screens: {
    Home: {
      screen: HomeScreen,
      options: {
        title: 'Kezdőlap',
        tabBarIcon: () => ({ sfSymbol: 'house', fallback: require('./assets/home.png') }),
      },
    },
    Settings: {
      screen: SettingsScreen,
      options: {
        title: 'Beállítások',
        tabBarIcon: () => ({ sfSymbol: 'gear', fallback: require('./assets/settings.png') }),
      },
    },
  },
});

iOS-en az sfSymbol a natív SF Symbols rendszerből veszi az ikont, míg Androidon a fallback képet használja. Ez a megközelítés valódi platformhű megjelenést eredményez minimális kóddal. A natív bottom tabs integráció közvetlen kapcsolatban áll a React Native Új Architektúrájával — ha többet szeretnél tudni az Expo SDK 55 és az Új Architektúra kapcsolatáról, érdemes elolvasni az erről szóló útmutatónkat.

Drawer Navigátor

A drawer (fiókos) navigátor egy oldalsó menüt biztosít, amelyet gesztussal vagy programmatikusan lehet megnyitni. Kiválóan alkalmas tartalom-gazdag appokhoz, ahol sok menüpontot kell elrejteni.

npm install @react-navigation/drawer
npm install react-native-gesture-handler react-native-reanimated
import { createDrawerNavigator } from '@react-navigation/drawer';
import { GestureHandlerRootView } from 'react-native-gesture-handler';

const Drawer = createDrawerNavigator({
  drawerType: 'slide',
  drawerPosition: 'left',
  screenOptions: {
    drawerActiveTintColor: '#6200ee',
    drawerStyle: { backgroundColor: '#f5f5f5', width: 280 },
  },
  screens: {
    Home: { screen: HomeScreen, options: { title: 'Főoldal' } },
    Settings: { screen: SettingsScreen, options: { title: 'Beállítások' } },
    About: { screen: AboutScreen, options: { title: 'Rólunk' } },
  },
});

export default function App() {
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      <SafeAreaProvider>
        <Navigation />
      </SafeAreaProvider>
    </GestureHandlerRootView>
  );
}

A drawer navigátor animációi a React Native Reanimated könyvtárat használják a háttérben. Ha egyéni animációkat szeretnél hozzáadni a fiókos menühöz, érdemes megismerkedni a React Native Reanimated 4 animációs lehetőségeivel.

Beágyazott Navigátorok

A legtöbb valódi alkalmazásban kombinálni kell a navigátorokat. Egy tipikus struktúra: a Stack navigátor tartalmaz egy Tab navigátort, amely képernyőkre mutat. Ez eleinte bonyolultnak tűnhet, de a statikus API-val jóval átláthatóbb lett.

const HomeTabs = createBottomTabNavigator({
  screens: {
    Feed: { screen: FeedScreen, options: { title: 'Hírfolyam' } },
    Notifications: { screen: NotificationsScreen, options: { title: 'Értesítések' } },
  },
});

const RootStack = createNativeStackNavigator({
  screens: {
    Main: {
      screen: HomeTabs,
      options: { headerShown: false },
    },
    Modal: {
      screen: ModalScreen,
      options: { presentation: 'modal' },
    },
    Settings: {
      screen: SettingsScreen,
      options: { title: 'Beállítások' },
    },
  },
});

TypeScript beágyazott navigátorhoz

A NavigatorScreenParams típus segít a beágyazott navigátor paraméterlistájának megadásában:

import type { NavigatorScreenParams } from '@react-navigation/native';

type TabParamList = {
  Feed: undefined;
  Notifications: { unreadCount?: number };
};

type RootStackParamList = {
  Main: NavigatorScreenParams<TabParamList>;
  Modal: { message: string };
  Settings: undefined;
};

// Navigálás beágyazott képernyőre
navigation.navigate('Main', {
  screen: 'Notifications',
  params: { unreadCount: 5 },
});

Navigáció Hooks és Segédeszközök

A React Navigation v7 számos hasznos hookot biztosít az életciklus-kezeléshez és a navigációs állapot olvasásához — ezeket érdemes jól megismerni, mert sokat fogod őket használni:

import {
  useNavigation,
  useRoute,
  useFocusEffect,
  useIsFocused,
} from '@react-navigation/native';
import { useCallback } from 'react';

function MyScreen() {
  const navigation = useNavigation();
  const isFocused = useIsFocused();

  // Erőforrások kezelése fókusz alapján
  useFocusEffect(
    useCallback(() => {
      const subscription = setupWebSocket();
      return () => {
        subscription.close();
      };
    }, [])
  );

  return <Text>{isFocused ? 'Aktív' : 'Háttér'}</Text>;
}

Deep Linking a Static API-val

A statikus API egyik legnagyobb előnye, hogy a deep linking konfiguráció automatikusan generálódik a navigációs struktúrából — nincs szükség kézi karbantartásra. Ez korábban rengeteg hibaforrás volt.

import * as Linking from 'expo-linking';

const linking = {
  prefixes: [Linking.createURL('/'), 'https://myapp.com'],
  // A config automatikusan generálódik a statikus struktúrából!
  config: RootStack.Navigator.getPathConfig(),
};

export const Navigation = createStaticNavigation(RootStack);

export default function App() {
  return (
    <SafeAreaProvider>
      <Navigation linking={linking} />
    </SafeAreaProvider>
  );
}

Hitelesítési Folyam Implementálása

A statikus API if tulajdonságával feltételesen jeleníthetsz meg képernyőket — ez ideális a hitelesítési folyamathoz, és sokkal elegánsabb, mint a korábbi megoldások.

import { useAuth } from './useAuth';

function useIsSignedIn() {
  const { isSignedIn } = useAuth();
  return isSignedIn;
}

function useIsSignedOut() {
  const { isSignedIn } = useAuth();
  return !isSignedIn;
}

const RootStack = createNativeStackNavigator({
  screens: {
    Home: { if: useIsSignedIn, screen: HomeScreen },
    Profile: { if: useIsSignedIn, screen: ProfileScreen },
    Login: { if: useIsSignedOut, screen: LoginScreen },
    Register: { if: useIsSignedOut, screen: RegisterScreen },
  },
});

Amikor az isSignedIn állapot megváltozik, a navigátor automatikusan frissíti a látható képernyők listáját. Nem kell manuálisan navigálni be- és kijelentkezéskor — csak az állapotot kell frissíteni, a többi magától megtörténik.

Teljesítményoptimalizálás

Végül néhány bevált gyakorlat, amelyek valóban számítanak a teljesítmény szempontjából:

  • Native Stack Navigator: Mindig a @react-navigation/native-stack-et részesítsd előnyben a JS-alapú @react-navigation/stack-kel szemben — a natív animációk lényegesen gördülékenyebbek.
  • Lazy loading: Tab navigátorban a képernyők alapértelmezés szerint lustaán töltődnek be, ami csökkenti a kezdeti betöltési időt.
  • react-native-screens engedélyezése: Az enableScreens() hívás gondoskodik arról, hogy a háttérképernyők 0% CPU-t fogyasszanak.
  • Header memoizálás: Egyéni header komponenseket védd React.memo-val, hogy elkerüld a felesleges újrarenderelést navigáláskor.
  • Kerüld az inline callback-eket az options-ban: A navigátor screenOptions-eit ne definiáld inline függvényként, hogy elkerüld a felesleges újralétrehozást.

Gyakran Ismételt Kérdések

Mi a különbség a React Navigation statikus és dinamikus API-ja között?

A statikus API-ban a navigációs struktúrát konfigurációs objektumban definiálod, amelyből automatikusan generálódnak a TypeScript típusok és a deep linking beállítások. A dinamikus API-ban JSX komponensként definiálod a navigátorokat, ami rugalmasabb, de manuális típusdefiniálást igényel. Új projektekhez a statikus API javasolt, mivel jelentősen csökkenti a boilerplate kódot és a hibalehetőségeket.

Hogyan navigálhatok programmatikusan egy beágyazott Tab navigátor képernyőjére?

A navigation.navigate() metódusban add meg a szülő képernyő nevét, majd a screen és params tulajdonságokat: navigation.navigate('Main', { screen: 'Notifications', params: { unreadCount: 5 } }). TypeScript típusbiztonsághoz használd a NavigatorScreenParams típust a paraméterlistában.

Mikor érdemes Native Bottom Tabs-t használni JS Bottom Tabs helyett?

A Native Bottom Tabs az operációs rendszer natív komponenseit (iOS: SwiftUI TabView, Android: BottomNavigationView) használja, ezért automatikusan platformhű megjelenést nyújt. Válaszd, ha fontos a natív look and feel és elfogadod, hogy a testreszabási lehetőségek korlátozottabbak a JS alapú megvalósításhoz képest. Jelenleg kísérleti (experimental) állapotban van.

Hogyan implementálható a hitelesítési folyamat React Navigation v7-ben?

A statikus API if tulajdonságával feltételesen jeleníthetsz meg képernyőket egy React hook visszatérési értéke alapján. Ha az autentikációs állapot megváltozik, a navigátor automatikusan frissíti a látható képernyőket — nincs szükség manuális navigation.navigate() hívásra a be- és kijelentkezéskor.

Kompatibilis-e a React Navigation v7 az Expo SDK 55-tel és a React Native Új Architektúrájával?

Igen, a React Navigation v7 teljes mértékben kompatibilis az Expo SDK 55-tel és a React Native Új Architektúrájával. A react-native-screens és a react-native-gesture-handler natív modulként működnek az Új Architektúrában, maximális teljesítményt és gördülékeny animációkat biztosítva.

A Szerzőről Priya Raghunathan

Priya is a staff mobile engineer with nine years working in React Native, currently consulting for fintech and healthtech teams shipping on both stores from a single codebase. She spent four years at Klarna on the merchant-facing app, where she led the migration off a legacy Java Android codebase to React Native 0.68 and later drove the New Architecture rollout (Fabric + TurboModules) for roughly 14 million MAU. Before Klarna she was at Coinbase on the wallet team, writing native bridges to Secure Enclave and Android Keystore. She maintains two small open-source libraries for biometric auth and contributes occasional PRs to react-native-screens. She writes here mostly about performance profiling with Flipper and Hermes, EAS Build pipelines, and the practical headaches of running a brownfield RN app inside a 12-year-old iOS host.