Stack Navigatorで基本の画面遷移を扱う
ボタンを押すと新しい画面が開く、左上のボタンを押すと戻る、といった「普通の」画面遷移を扱うのがStack Navigatorです。 @react-navigation/stack
をインストールすることで利用できるようになります(リスト5)。
$ npm install @react-navigation/stack
まずは、画面を1つだけ定義してみましょう。画面に見立てたHomeScreen
コンポーネントを用意して、Stack Navigatorにセットします(リスト6)。
import * as React from 'react'; import { View, Text } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; function HomeScreen() { return ( <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }} > <Text>Home Screen</Text> </View> ); } // (1) StackNavigatorを生成する const Stack = createStackNavigator(); export default function App() { return ( <NavigationContainer> <Stack.Navigator> {/* (2) StackNavigator用の画面を定義する */} <Stack.Screen name="Home" component={HomeScreen} /> </Stack.Navigator> </NavigationContainer> ); }
まずは(1)のようにcreateStackNavigator()
関数でStack
オブジェクトを生成します。画面の定義は(2)のようにStack.Screen
コンポーネントで行い、 Stack.Navigator
で囲みます。実行すると図4の通りになります。
HomeScreen
が表示されましたね。デフォルトでname
属性がヘッダーのタイトルとして表示されています。
画面遷移する
それではそろそろ本題に入りましょう。2つ目の画面を用意し、画面遷移をしてみます(リスト7)。
import 'react-native-gesture-handler'; import React from 'react'; import { View, Text, Button } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import { useNavigation } from '@react-navigation/native'; function HomeScreen() { const navigation = useNavigation(); // (2) return ( <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }} > <Text>Home Screen</Text> <Button title="詳細へ" onPress={() => navigation.navigate('Detail')} />{/* (3) */} </View> ); } function DetailScreen() { return ( <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }} > <Text>Detail Screen</Text> </View> ); } const Stack = createStackNavigator(); export default function App() { return ( <NavigationContainer> <Stack.Navigator initialRouteName="Home">{/* (1) */} <Stack.Screen name="Home" component={HomeScreen} /> <Stack.Screen name="Detail" component={DetailScreen} /> </Stack.Navigator> </NavigationContainer> ); }
DetailScreen
を追加しました。複数のスクリーンがある場合には、(1)のように initialRouteName
属性を設定して、どのスクリーンを初期表示に使うのかを明示します。
画面間を移動する場合は、まず(2)のようにuseNavigation()
フックを使って、 navigation
オブジェクトを取り出します。次に、任意のタイミングで(3)の navigation.navigate()
関数を実行することで、画面遷移が発生します(図5)。今回はボタンで実装しましたが、任意のタイミングで構いません。
戻るボタンは自動で現れるので、単純な画面遷移であれば何も設定する必要はありません。
このように、画面を行ったり来たりするだけであれば、簡単に実装できます。
タイトルを変更する
タイトルを変更したい場合は、options
属性でリスト8のように指定しましょう。
<Stack.Screen name="Home" component={HomeScreen} options={{ title: 'ホーム' }} />
すると、図8の通りタイトルが変わります。
日本語のタイトルをつけたい場合は、この機能を使うと良いでしょう。