概要: このチュートリアルでは、React Navigationライブラリを使用してドロワーナビゲーターを作成する方法を学びます。
React Native Drawer ナビゲーション入門
ドロワーは、画面の左端または右端からスライドインするUI要素です。異なる画面に移動するために選択できるメニュー項目のリストが含まれています。

通常、ハンバーガーアイコンなどのボタンをタップするか、スワイプジェスチャでドロワーを開きます。

ドロワーナビゲーションは、モバイルアプリで一般的なパターンです。ドロワーナビゲーションを設定するには、React Navigationライブラリが提供するドロワーナビゲーターを使用できます。
React Nativeアプリの作成
このセクションでは、ドロワーナビゲーションのセットアップと使用方法について説明します。
要件
始める前に、次のものがあることを確認してください。
react-native
>=0.63
.0expo
>= 41 (Expo Goを使用する場合)
新規プロジェクトのセットアップ
まず、ターミナルを開き、次のコマンドを実行して新しいReact Nativeアプリを作成します。
npx create-expo-app drawer --template blank
Code language: JavaScript (javascript)
このコマンドはdrawer
ディレクトリを作成し、React Nativeアプリの構造を初期化します。
次に、プロジェクトディレクトリdrawer
に移動します。
cd drawer
Code language: JavaScript (javascript)
次に、次のコマンドを実行してReact Navigationライブラリとその依存関係をインストールします。
npm install @react-navigation/native @react-navigation/drawer react-native-gesture-handler react-native-reanimated
Code language: JavaScript (javascript)
画面の作成
ステップ1. 画面を格納するためのscreens
ディレクトリをプロジェクトディレクトリに作成します。
ステップ2. screens
ディレクトリにHome
画面を作成します。
import { SafeAreaView, StyleSheet, Text, View } from 'react-native';
const Home = () => {
return (
<SafeAreaView style={styles.container}>
<View style={styles.screen}>
<Text>Home Screen</Text>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
screen: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}
});
export default Home;
Code language: JavaScript (javascript)
ステップ3. screens
ディレクトリにProfile
画面を作成します。
import { SafeAreaView, StyleSheet, Text, View } from 'react-native';
const Profile = () => {
return (
<SafeAreaView style={styles.container}>
<View style={styles.screen}>
<Text>Profile Screen</Text>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
screen: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}
});
export default Profile;
Code language: JavaScript (javascript)
ステップ4. screens
ディレクトリにindex.js
を作成し、Home
とProfile
画面をインポートしてすぐにエクスポートします。
import Home from './Home.jsx';
import Profile from './Profile.jsx';
export { Home, Profile }
Code language: JavaScript (javascript)
ステップ5. Home
とProfile
画面をApp.js
ファイルにインポートし、Home
画面をメインコンポーネントとして配置します。
import { Home, Profile } from './screens/index';
export default function App() {
return (
<Home />
);
}
Code language: JavaScript (javascript)
ステップ6. ターミナルを開いてアプリを実行します。
npm start
Code language: JavaScript (javascript)
ドロワーナビゲーションのセットアップ
ステップ1. 次のコードを使用してApp.js
を修正します。
import { NavigationContainer } from '@react-navigation/native';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { Home, Profile } from './screens/index';
const Drawer = createDrawerNavigator();
const App = () => {
return (
<NavigationContainer>
<Drawer.Navigator initialRouteName="Home">
<Drawer.Screen name="Home" component={Home} />
<Drawer.Screen name="Profile" component={Profile} />
</Drawer.Navigator>
</NavigationContainer>
);
}
export default App;
Code language: JavaScript (javascript)
出力
動作原理
まず、NavigationContainer
コンポーネントとcreateDrawerNavigator
関数をインポートします。
import { NavigationContainer } from '@react-navigation/native';
import { createDrawerNavigator } from '@react-navigation/drawer';
Code language: JavaScript (javascript)
次に、Home
とProfile
画面をインポートします。
import { Home, Profile } from './screens/index';
Code language: JavaScript (javascript)
次に、createDrawerNavigator()
関数を呼び出してドロワーナビゲーターオブジェクトを作成します。
const Drawer = createDrawerNavigator();
Code language: JavaScript (javascript)
ドロワーナビゲーターオブジェクト(Drawer
)には2つのプロパティがあります。
- ナビゲーター
- 画面
4つ目、ドロワーナビゲーションを設定します。
<NavigationContainer>
<Drawer.Navigator initialRouteName="Home">
<Drawer.Screen name="Home" component={Home} />
<Drawer.Screen name="Profile" component={Profile} />
</Drawer.Navigator>
</NavigationContainer>
Code language: JavaScript (javascript)
NavigationContainer
コンポーネントは、ナビゲーションツリーと状態を管理します。ナビゲーションを有効にするために、ドロワーナビゲーターをNavigationContainer
コンポーネントでラップします。これにより、React Navigationはさまざまな画面間でナビゲーション状態を適切に管理できます。
Drawer.Navigator
コンポーネントは、ドロワーナビゲーターを設定します。画面の開閉や画面間の移動など、ドロワーの状態と動作を管理します。
オプションのinitialRouteName
プロップは、最初にレンダリングされる画面を指定します。initialRouteName
プロップを指定しないと、Drawer.Navigator
はリストの最初の画面を表示します。
Drawer.Screen
コンポーネントは、ドロワーからアクセスできる画面を宣言します。
name
は、プログラムで参照できるルートの名前を定義します。component
は、画面が選択されたときにレンダリングされるコンポーネントを指定します。この例では、2つの画面に対応する2つのコンポーネントHome
とProfile
を指定します。
アプリの起動時、NavigationContainer
はナビゲーションコンテキストを初期化し、Drawer.Navigator
はドロワーナビゲーションを設定します。Drawer.Screen
コンポーネントで指定されたように、ドロワーに2つの画面を追加します。
ドロワーを開くと、「Home」と「Profile」の2つのオプションが表示されます。
ドロワーナビゲーターコンポーネントでinitialRouteName
として定義されているため、ドロワーはHome
画面を表示します。「Profile」を選択すると、Profile
画面がレンダリングされます。
ドロワーのカスタマイズ
アバター、名前、タイトルを含むヘッダーを追加することで、ドロワーをカスタマイズします。さらに、各ナビゲーションアイテムにアイコンを追加します。

ステップ1. 次のavatar.pngファイルをダウンロードし、assets
ディレクトリにコピーします。

ステップ2. ドロワーをカスタマイズするために、App.js
ファイルを修正します。
import { NavigationContainer } from '@react-navigation/native';
import { createDrawerNavigator, DrawerItemList } from '@react-navigation/drawer';
import Icon from '@expo/vector-icons/MaterialCommunityIcons';
import { Home, Profile } from './screens/index';
import { View, Text, StyleSheet, Image } from 'react-native';
const Drawer = createDrawerNavigator();
const App = () => {
return (
<NavigationContainer>
<Drawer.Navigator
initialRouteName="Home"
drawerContent={
(props) => {
return (
<View style={styles.drawer}>
<View style={styles.drawerHeader}>
<Image source={require('./assets/avatar.png')} style={styles.logo} />
<Text style={styles.title}>John Smith</Text>
<Text style={styles.subtitle}>Developer</Text>
</View>
<DrawerItemList {...props} />
</View>
);
}
}
screenOptions={{
drawerStyle: {
width: 250
},
drawerActiveBackgroundColor: '#eee',
drawerLabelStyle: {
color: '#111',
marginLeft: -20,
}
}}
>
<Drawer.Screen
name="Home"
component={Home}
options={{
drawLabel: 'Home',
title: 'Home',
drawerIcon: () => <Icon name="home-outline" size={24} color="black" />
}}
/>
<Drawer.Screen
name="Profile"
component={Profile}
options={{
drawLabel: 'Profile',
title: 'Profile',
drawerIcon: () => <Icon name="account-outline" size={24} color="black" />
}} />
</Drawer.Navigator>
</NavigationContainer>
);
}
const styles = StyleSheet.create({
drawer: {
flex: 1,
},
drawerHeader: {
paddingTop: 20,
width: '100%',
height: 180,
justifyContent: 'center',
alignItems: 'center',
borderBottomColor: '#ddd',
borderBottomWidth: 1,
backgroundColor: '#f9dc5c'
},
logo: {
width: 80,
height: 80,
borderRadius: 40,
resizeMode: 'center',
marginBottom: 10
},
title: {
fontSize: 20,
color: '#323330',
fontWeight: 'bold'
},
subtitle: {
fontSize: 14,
color: '#444'
}
});
export default App;
Code language: JavaScript (javascript)
動作原理
コンポーネントのリストを次に示します。
NavigationContainer
コンポーネントはドロワーナビゲーションをラップし、ナビゲーション状態を管理します。Drawer.Navigator
コンポーネントはドロワーナビゲーターを作成します。Drawer.Screen
コンポーネントは、ドロワーナビゲーター内の各画面を表します。DrawerItemList
コンポーネントは、ドロワーアイテムのリストをレンダリングします。Icon
コンポーネントは、@expo/vector-icons
パッケージからアイコンを表示します。
まず、ナビゲーション状態を適切に管理するために、NavigationContainer
コンポーネントを使用してドロワーナビゲーションをラップします。
<NavigationContainer>
</NavigationContainer>
Code language: JavaScript (javascript)
次に、Drawer.Navigator
コンポーネントで初期ルート名をHome画面に設定し、drawerContent
プロップを使用してドロワーコンテンツをカスタマイズします。
<Drawer.Navigator
initialRouteName="Home"
drawerContent={/*...*/}>
Code language: HTML, XML (xml)
ドロワーコンテンツには、アバター、名前(John Smith
)、タイトル(developer
)、およびドロワーアイテムのリストが表示されます。DrawerItemListコンポーネントは、drawerContent関数に渡されたプロップに基づいてナビゲーションアイテムをレンダリングします。
次に、screenOptions
プロップを使用してドロワーのプロパティを設定します。
drawerStyle
プロパティは、ドロワーの幅を250に設定します。drawerActiveBackgroundColor
は、アクティブなドロワーアイテムの背景色を薄い灰色(#eee
)に設定します。drawerLabelStyle
: ドロワーアイテムラベルの色とmarginLeft
を設定します。
最後に、ドロワーナビゲーションアイテムの画面を設定します。各画面について、ルート名(name)、レンダリングするコンポーネント(component)、およびラベルとアイコンのオプションを設定します。
<Drawer.Screen
name="Home"
component={Home}
options={{
drawLabel: 'Home',
title: 'Home',
drawerIcon: () => <Icon name="home-outline" size={24} color="black" />
}}
/>
<Drawer.Screen
name="Profile"
component={Profile}
options={{
drawLabel: 'Profile',
title: 'Profile',
drawerIcon: () => <Icon name="account-outline" size={24} color="black" />
}} />
Code language: JavaScript (javascript)
出力
まとめ
- React Navigationのドロワーナビゲーターを使用して、ドロワーナビゲーションを作成します。