接着学习,自定义底部TabBar
要使用此导航器,请确保您具有 @react-navigation/native
及其依赖项(按照本指南操作),然后安装 @react-navigation/bottom-tabs
:
npm install @react-navigation/bottom-tabs
D:\react\rnApp\components\MyTabBar\index.ts
import * as React from 'react'; import type {PropsWithChildren} from 'react'; import {View, Text, TouchableOpacity} from 'react-native';
type SectionProps = PropsWithChildren<{ state?: any; navigation?: any; route?: any; descriptors?: any; }>;
function MyTabBar({ state, descriptors, navigation, }: SectionProps): React.JSX.Element { return ( <View style={{flexDirection: 'row'}}> {state.routes.map((route: any, index: number) => { const {options} = descriptors[route.key]; const label = options.tabBarLabel !== undefined ? options.tabBarLabel : options.title !== undefined ? options.title : route.name;
const isFocused = state.index === index;
const onPress = () => { const event = navigation.emit({ type: 'tabPress', target: route.key, });
if (!isFocused && !event.defaultPrevented) { navigation.navigate(route.name); } };
const onLongPress = () => { navigation.emit({ type: 'tabLongPress', target: route.key, }); };
return ( <TouchableOpacity accessibilityRole="button" accessibilityState={isFocused ? {selected: true} : {}} accessibilityLabel={options.tabBarAccessibilityLabel} testID={options.tabBarTestID} onPress={onPress} onLongPress={onLongPress} key={index} style={{ flex: 1, height: 60, justifyContent: 'center', alignItems: 'center', }}> <Text style={{ color: isFocused ? '#673ab7' : '#222', fontWeight: 'bold', }}> {label} </Text> </TouchableOpacity> ); })} </View> ); }
export default MyTabBar;
|
App.tsx
import * as React from 'react'; import {View, Text, Button} from 'react-native'; import type {PropsWithChildren} from 'react';
import {NavigationContainer} from '@react-navigation/native'; import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'; import {createNativeStackNavigator} from '@react-navigation/native-stack';
import MyTabBar from './components/MyTabBar/index';
type SectionProps = PropsWithChildren<{ state?: any; navigation?: any; route?: any; descriptors?: any; }>;
function HomeScreen() { return ( <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}> <Text>Home!</Text> </View> ); }
function SettingsScreen({navigation}: SectionProps): React.JSX.Element { return ( <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}> <Text>Settings!</Text> <Button title="Go to Details... again" onPress={() => navigation.push('Details')} /> </View> ); }
function DetailsScreen({navigation}: SectionProps): React.JSX.Element { return ( <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}> <Text>Details Screen</Text> <Button title="Go to Details... again" onPress={() => navigation.push('Details')} /> </View> ); }
const Tab = createBottomTabNavigator(); const SettingsStack = createNativeStackNavigator();
export default function App() { return ( <NavigationContainer> <Tab.Navigator tabBar={props => <MyTabBar {...props} />}> <Tab.Screen name="Home" component={HomeScreen} /> <Tab.Screen name="Settings" options={{headerShown: true}}> {() => ( <SettingsStack.Navigator> <SettingsStack.Screen name="SettingsHome" component={SettingsScreen} /> <SettingsStack.Screen name="Details" component={DetailsScreen} /> </SettingsStack.Navigator> )} </Tab.Screen> </Tab.Navigator> </NavigationContainer> ); }
|