在手機中,有一些關於 App 導覽列的設定,例如左邊有返回鍵、中間呈現頁面標題等等,並且會根據 Android 或 iOS 改變樣式。而 React Navigation 會為我們預設這些內容,但仍提供我們使用 options 這個屬性來更改的彈性。
例如,它會將 Screen 的 name 屬性預設為 Header 標題,但我們能傳入客製化 title 。如此一來,頁面的標題就改變了:
<Stack.Screen
name="Home"
component={HomeScreen}
options={{title: 'CustomHome'}}
/>
在 options 中,也可以傳入包著 route 的物件,來取得路由參數,當成 Header 標題。不過,參數必須要是字串,不可以是其他型別的資料。
function HomeScreen({navigation}) {
return (
<View>
<Text>MENU</Text>
<TouchableOpacity
onPress={() => navigation.navigate('Detail', {id: 0, title: '滷肉飯'})}>
<Text>滷肉飯</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={() => navigation.navigate('Detail', {id: 1, title: '炒米粉'})}>
<Text>炒米粉</Text>
</TouchableOpacity>
</View>
);
}
function DetailScreen({navigation, route}) {
const {id} = route.params;
return (
<View>
<Text>{id}</Text>
<Text>{id === 0 ? '滷肉飯' : '炒米粉'}</Text>
… 省略
</View>
);
}
除了標題外,能調整的屬性還有:
<Stack.Screen
name="Detail"
component={DetailScreen}
options={({route}) => ({
title: route.params.title,
headerStyle: {backgroundColor: '#f4511e'},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
},
})}
/>
<Stack.Screen
name="Detail"
component={DetailScreen}
options={() => ({
headerShown: false,
headerTransparent: true,
headerBackground: () => null,
})}
/>
此外,也可以自由設定 Header 左邊、中間、右邊要放什麼。
<Stack.Screen
name="Detail"
component={DetailScreen}
options={() => ({
headerRight: () => <Button title="右邊的按鈕" />,
})}
/>
現行主流的App 常會在下方設計導覽列 Bottom Navigation ,因為 App 主要使用者多透過手機下載,而選單設計在下方能讓單手操作更為便利。在這節中我們就要來看看如何透過 React Navigation ,來建立 Bottom Navigation 。
在終端機輸入 npm install @react-navigation/bottom-tabs
下載,建立兩個頁面元件: HomeScreen 和 SettingsScreen 。
import React from 'react';
import {View, Text} from 'react-native';
function HomeScreen() {
return (
<View>
<Text>Home</Text>
</View>
);
}
function SettingsScreen() {
return (
<View>
<Text>Settings</Text>
</View>
);
}
我們不用再引入 createNativeStackNavigator ,改從剛剛下載的 @react-navigation/bottom-tabs
引入 createBottomTabNavigator 。用相同的邏輯,宣告 Tab 變數並完成 BottomNavigation 元件。
import {NavigationContainer} from '@react-navigation/native';
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function BottomeNavigation() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}
最後,在 App.js 一樣要引入 NavigationContainer ,包在剛剛做好的 BottomNavigation 元件外面。
import {NavigationContainer} from '@react-navigation/native';
function App() {
return (
<NavigationContainer>
<BottomeNavigation />
</NavigationContainer>
);
}
如此一來就完成了。邏輯基本上和 Stack 大同小異,十分簡單。