yarn add @react-navigation/native
yarn add react-native-screens react-native-safe-area-context
yarn add @react-navigation/native-stack
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: '首页' }}
/>
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{ title: '详情' }}
/>
</Stack.Navigator>
</NavigationContainer>
);
}
function HomeScreen({ navigation }) {
return (
<View>
<Button
title="跳转到详情"
onPress={() => navigation.navigate('Details', { id: 1 })}
/>
</View>
);
}
function DetailsScreen({ route, navigation }) {
const { id } = route.params;
return (
<View>
<Text>详情页 ID: {id}</Text>
<Button title="返回" onPress={() => navigation.goBack()} />
</View>
);
}
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
title: '首页',
headerStyle: {
backgroundColor: '#007AFF'
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold'
},
headerRight: () => (
<Button title="更多" onPress={() => {}} />
)
}}
/>
yarn add @react-navigation/bottom-tabs
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Icon from 'react-native-vector-icons/Ionicons';
const Tab = createBottomTabNavigator();
function App() {
return (
<NavigationContainer>
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {
let iconName;
if (route.name === 'Home') {
iconName = focused ? 'home' : 'home-outline';
} else if (route.name === 'Profile') {
iconName = focused ? 'person' : 'person-outline';
}
return <Icon name={iconName} size={size} color={color} />;
},
tabBarActiveTintColor: '#007AFF',
tabBarInactiveTintColor: 'gray'
})}
>
<Tab.Screen name="Home" component={HomeScreen} options={{ title: '首页' }} />
<Tab.Screen name="Profile" component={ProfileScreen} options={{ title: '我的' }} />
</Tab.Navigator>
</NavigationContainer>
);
}
yarn add @react-navigation/drawer
yarn add react-native-gesture-handler react-native-reanimated
import { createDrawerNavigator } from '@react-navigation/drawer';
const Drawer = createDrawerNavigator();
function App() {
return (
<NavigationContainer>
<Drawer.Navigator>
<Drawer.Screen name="Home" component={HomeScreen} />
<Drawer.Screen name="Profile" component={ProfileScreen} />
</Drawer.Navigator>
</NavigationContainer>
);
}
function HomeTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Feed" component={FeedScreen} />
<Tab.Screen name="Messages" component={MessagesScreen} />
</Tab.Navigator>
);
}
function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeTabs} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
import { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';
function MyScreen() {
const navigation = useNavigation();
const route = useRoute();
useFocusEffect(
React.useCallback(() => {
console.log('页面聚焦');
return () => {
console.log('页面失焦');
};
}, [])
);
return (
<View>
<Button title="跳转" onPress={() => navigation.navigate('Details')} />
</View>
);
}
const linking = {
prefixes: ['myapp://'],
config: {
screens: {
Home: 'home',
Details: 'details/:id'
}
}
};
function App() {
return (
<NavigationContainer linking={linking}>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}