Stack Navigatorとは何か、React Nativeにおけるスタックナビゲーション

著者: IT Sectr 公開日: 2026-02-22 読了時間: 11 分

Stack Navigator — スタックの原則(LIFO)に従ってモバイルアプリケーションの画面を管理するためのReact Navigationライブラリのコンポーネントです。新しい画面は前の画面の上に配置され、「戻る」ボタンで上部の画面が削除され、ユーザーは前の画面に戻ります。ナビゲーションアーキテクチャの詳細については、React Navigation公式ドキュメントをご覧ください。

重要なポイント

  • Stack Navigator — スタックの原則(LIFO)に従って画面を管理するReact Navigationコンポーネント
  • スタックナビゲーション — 各画面は前の画面の上に配置され、「戻る」ボタンで現在の画面が削除される
  • Native Stack — UINavigationController(iOS)とFragment(Android)によるネイティブ実装
  • アニメーション — 組み込みトランジション(slide、fade、none)とcardStyleInterpolatorによるカスタムアニメーション
  • TypeScript — RootStackParamListによるナビゲーションパラメータの完全な型付け

Stack Navigatorとは?

Stack Navigator — 画面のスタックモデルを実装するReact Navigationライブラリの基本的なナビゲーターの1つです。モバイルユーザーにとっておなじみのナビゲーションを提供します。新しい画面を開くと右にスライドするアニメーションが伴い、「戻る」ボタンまたはスワイプジェスチャーで前の画面に戻ります。Stack NavigatorはiOSとAndroidをサポートし、最大のパフォーマンスのためにプラットフォームのネイティブコンポーネントを使用します。

React NavigationはReact Nativeで最も人気のあるナビゲーションライブラリであり、プロジェクトの85%にインストールされています(npmデータ、2026年)。Stack Navigatorはそのコアの一部であり、2つの実装で利用可能です:createNativeStackNavigator(ネイティブ、推奨)とcreateStackNavigator(JavaScript、複雑なカスタムアニメーション用)。ネイティブバージョンはReact Navigation v5で登場し、v6+で標準になりました。

Stack Navigatorの主な利点 — iOSとAndroidユーザーにとって自然で親しみやすい動作です。iOSではスタックはUINavigationControllerによって視覚的に表現され、Androidではスライドアニメーション付きのFragmentManagerによって表現されます。開発者はスタックロジックを手動で実装する必要はありません。ナビゲーターが画面の状態、バックスタック、アニメーションを自動的に管理します。

スタックナビゲーションの仕組み

スタックナビゲーションはLIFO(Last In, First Out)の原則に基づいています。ユーザーが新しい画面を開くと、ナビゲーターはそれをスタックの一番上に配置します。「戻る」を押すと、上部の画面が削除され、ユーザーは前の画面を表示します。スタックは任意の数の画面を含めることができます。唯一の制限はデバイスのメモリです。

スタック内の各画面はその状態を保持します。前の画面に戻ると、その状態は自動的に復元されます。これにより、スタックは他のナビゲーションタイプ(Tab、Drawer)と区別されます。他のタイプでは画面が再作成される可能性があります。React Navigationは独自のナビゲーションコンテキストメカニズムを介して状態を管理します。

アクション結果
navigate画面をスタックの一番上に配置するnavigation.navigate('Profile')
goBackスタックから上部の画面を削除するnavigation.goBack()
push強制的に新しい画面を追加するnavigation.push('Profile')
popToTopルート画面に戻るnavigation.popToTop()
resetスタック全体を新しいセットに置き換えるnavigation.reset({ index: 0, routes: [...] })

戻るためのスワイプジェスチャー

iOSでは、Stack Navigatorは左端からのスワイプジェスチャーによる戻りをサポートしています。これはユーザーが期待する標準的なiOSの動作です。Androidでは、ジェスチャーはデフォルトで無効になっていますが、gestureEnabledオプションで有効にできます。Native Stackでは、ジェスチャーはJavaScriptスレッドの遅延なしにネイティブで動作します。

Native Stack vs JS Stack

React Navigationは2種類のStack Navigatorを提供しています。Native Stack(createNativeStackNavigator)とJS Stack(createStackNavigator)です。主な違いはアニメーションの実行場所です。Native StackはiOSとAndroidのネイティブアニメーションドライバーを使用するのに対し、JS StackはReact NativeのJavaScriptスレッドを介して動作します。どちらを選ぶかは、パフォーマンスとカスタマイズの要件によって決まります。

Native Stackはほとんどのプロジェクトで推奨されています。JSスレッドをブロックせずにスムーズな60 FPSアニメーションを提供し、iOSでシステムのスワイプバックジェスチャーをサポートし、ネイティブトランジション(iOSではslide、Androidではfade)を使用します。ただし、Native Stackはアニメーションのカスタマイズに制限があり、事前定義されたトランジションセットのみが利用可能です。

JS StackはcardStyleInterpolatorを介してアニメーションを完全に制御できます。開発者はスケーリング、回転、パララックス、カスタムカーブなど、あらゆるアニメーションを作成できます。欠点は、アニメーションがJSスレッドで実行されるため、複雑なトランジションでは弱いデバイスでフレームドロップが発生する可能性があることです。70%のプロジェクトでは、Native Stackで十分です。

typescript
// Native Stack — 推奨される実装
import { createNativeStackNavigator } from '@react-navigation/native-stack';

type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string; name: string };
  Settings: undefined;
};

const Stack = createNativeStackNavigator<RootStackParamList>();

function AppNavigator() {
  return (
    <Stack.Navigator screenOptions={{ headerShown: true }}>
      <Stack.Screen name="Home" component={HomeScreen} />
      <Stack.Screen name="Profile" component={ProfileScreen} />
      <Stack.Screen name="Settings" component={SettingsScreen} />
    </Stack.Navigator>
  );
}

Stack Navigatorのインストールと設定

Stack Navigatorを使い始めるには、React Navigationとその依存関係をインストールする必要があります。最小セットには@react-navigation/native、@react-navigation/native-stack、react-native-screensが含まれます。インストール後、アプリケーションはNavigationContainerでラップされます。これはすべての子コンポーネントにナビゲーション状態を提供するコンテキストです。

bash
# React Navigationの依存関係のインストール
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context

# iOSの場合 — podのインストール
cd ios && pod install && cd ..

インストール後、Stack.NavigatorがRootStackParamListで定義された特定の画面とともに作成されます。各画面はcomponent propを介してReactコンポーネントにリンクされます。ナビゲーターはルートにも、別のナビゲーター(Tab、Drawer)にネストすることもできます。設定にはscreenOptionsが使用されます。すべての画面に共通のものか、各画面に個別のものを使用します。

typescript
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

type RootStackParamList = {
  Home: undefined;
  Details: { itemId: number; title: string };
};

const Stack = createNativeStackNavigator<RootStackParamList>();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home"
        screenOptions={{
          headerStyle: { backgroundColor: '#6200ee' },
          headerTintColor: '#fff',
          gestureEnabled: true,
        }}>
        <Stack.Screen name="Home" component={HomeScreen}
          options={{ title: 'ホーム' }} />
        <Stack.Screen name="Details" component={DetailsScreen}
          options={({ route }) => ({ title: route.params.title })} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Stack Navigatorのパラメータとカスタマイズ

Stack Navigatorは外観と動作をカスタマイズするための多くのオプションを提供します。主要なパラメータはNavigatorレベルのscreenOptionsまたはScreenレベルのoptionsで設定します。開発者はヘッダー、トランジションアニメーション、スワイプジェスチャー、カードスタイル、背景の暗転を設定できます。設定の柔軟性により、ナビゲーションをアプリケーションのデザインシステムに適応させることができます。

オプション説明
headerShownboolean画面のヘッダーを表示または非表示にする
headerStyleobjectヘッダーバーのスタイル(backgroundColor、elevation)
headerBackTitlestring「戻る」ボタンのテキスト(iOS)
gestureEnabledbooleanスワイプバックジェスチャーを有効にする
animationstringアニメーションタイプ:slide_from_right、fade、none
contentStyleobject画面の内部領域のスタイル

cardStyleInterpolatorによるカスタムアニメーション

JS Stackでは、cardStyleInterpolatorを使用して画面間の任意のトランジションアニメーションを作成できます。これは、スケーリング、回転、パララックス、水平フリップなど、独自の視覚効果を実装するための強力なツールです。関数はアニメーションの進行値(current、next)を受け取り、アニメーション対象の要素のスタイルを返します。

TypeScriptによるナビゲーションの型付け

Stack NavigatorはTypeScriptを介した完全な型付けをサポートしています。これを行うには、RootStackParamList — キーが画面名で値がパラメータ型であるオブジェクト型を定義します。型付け後、navigation.navigateとroute.paramsはオートコンプリートと型チェックを取得します。これにより、コンパイル時のパラメータ渡しエラーが排除されます。

typescript
type RootStackParamList = {
  Home: undefined;
  Product: { id: string; category: string };
  Checkout: { items: CartItem[]; total: number };
};

// 型付けされた画面
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;

function ProductScreen({ navigation, route }: ProductScreenProps) {
  const { id, category } = route.params;

  return (
    <View>
      <Text>商品 {id} — {category}</Text>
      <Button title="カートに追加"
        onPress={() => navigation.navigate('Checkout', {
          items: [{ id, quantity: 1 }],
          total: 99.99,
        })} />
    </View>
  );
}

高度なシナリオ:モーダルウィンドウとグループ

Stack Navigatorは画面のグループ化とモーダルウィンドウをサポートしています。グループ(Screen Group)を使用すると、重複なく複数の画面に共通の設定を適用できます。モーダルウィンドウはstack presentation: 'modal'によって実装されます。画面が下から背景の暗転とともに開き、iOSのシステムモーダルのようです。このオプションはNative Stackでのみ利用可能です。

複雑なナビゲーションの場合、Stack NavigatorはTab NavigatorまたはDrawer Navigatorにネストできます。例えば、「ホーム」タブには独自の画面スタックがあり、「プロフィール」タブにも独自のものがあります。このナビゲーターの構成は、プロダクションアプリケーションの標準的なアプローチです。各スタックは分離されており、タブ内のバックスタックは他のタブに影響しません。

typescript
// Tab Navigator内のネストされたスタック
const HomeStack = createNativeStackNavigator<HomeStackParamList>();

function HomeStackScreen() {
  return (
    <HomeStack.Navigator>
      <HomeStack.Screen name="Feed" component={FeedScreen} />
      <HomeStack.Screen name="PostDetail" component={PostDetailScreen}
        options={{ presentation: 'modal' }} />
    </HomeStack.Navigator>
  );
}

// 共有オプションを持つ画面グループ
<Stack.Navigator>
  <Stack.Group screenOptions={{ headerShown: true }}>
    <Stack.Screen name="Main" component={MainScreen} />
    <Stack.Screen name="About" component={AboutScreen} />
  </Stack.Group>
  <Stack.Screen name="Auth" component={AuthScreen}
    options={{ presentation: 'modal', headerShown: false }} />
</Stack.Navigator>

よくある質問

Stack Navigatorのnavigateとpushの違いは何ですか?

navigateはまずスタック内に同じ名前の既存の画面を探し、見つかった場合はそこに移動します。pushは既に存在する場合でも、常に新しい画面をスタックの一番上に追加します。pushは、同じ画面を異なるデータで開く必要がある場合(ユーザープロフィールなど)に便利です。

Stack Navigatorで画面にパラメータを渡すには?

パラメータはnavigateメソッドの第2引数として渡します:navigation.navigate('Profile', { userId: '123', name: 'John' })。受け取る画面では、route.paramsを介してパラメータにアクセスできます。パラメータの型はTypeScriptのオートコンプリートのためにRootStackParamListで定義します。

Stack NavigatorとTab Navigator — どちらを選ぶべきですか?

Stack Navigatorは線形ナビゲーション(画面→詳細→編集)に適しています。Tab Navigatorはアプリケーションの並列セクション(ホーム、検索、プロフィール)に適しています。プロダクションプロジェクトでは、これらを組み合わせます。Tab Navigatorに各タブ用の複数のStack Navigatorを含めます。

Stack Navigatorの「戻る」ボタンはどのように機能しますか?

デフォルトでは、Stack Navigatorはルート以外のすべての画面のヘッダーに「戻る」ボタンを追加します。iOSでは、左端からのスワイプジェスチャーも機能します。navigation.goBack()メソッドは現在の画面をスタックから削除し、ユーザーを前の画面に戻します。

Stack Navigatorのアニメーションを完全にカスタマイズできますか?

Native Stackは事前定義されたアニメーション(slide_from_right、fade、none)を提供します。完全なカスタマイズには、JS StackをcardStyleInterpolatorとともに使用します。これはアニメーションの各フレームでカードのスタイルを返す関数です。これにより、スケーリング、パララックス、3D回転など、あらゆるトランジションを作成できます。

まとめ

  • Stack Navigator — ネイティブパフォーマンスでLIFOの原則に従って画面を管理するReact Navigationコンポーネント
  • Native Stack(createNativeStackNavigator)はiOSとAndroidのネイティブアニメーションを使用し、85%のプロジェクトで推奨される
  • RootStackParamListはTypeScriptでナビゲーションパラメータの完全な型付けを提供する
  • Screen optionsを使用して各画面のヘッダー、アニメーション、ジェスチャー、スタイルを設定できる
  • グループとモーダル — 関連する画面とモーダルウィンドウを整理するための組み込みメカニズム
  • ナビゲーターの構成 — プロダクションアーキテクチャではStack NavigatorをTab/Drawerにネストする
  • JS Stackは独自のトランジションのためcardStyleInterpolatorを介してアニメーションを完全に制御できる

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください