技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • 基础入门

    • React Native 学习指南
    • 核心组件
    • 样式
  • 进阶内容

    • 导航
    • 网络请求
    • 本地存储
    • 常用 API

导航

React Navigation

安装

yarn add @react-navigation/native
yarn add react-native-screens react-native-safe-area-context

Stack Navigator

安装

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={() => {}} />
    )
  }}
/>

Tab Navigator

安装

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>
  );
}

Drawer Navigator

安装

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>
  );
}
最近更新: 2026/2/6 15:39
Contributors: hailong
Next
网络请求