【问题标题】:Complex React Navigation states复杂的 React 导航状态
【发布时间】:2019-10-20 23:42:41
【问题描述】:

我想在我的 React Native 应用程序中使用 React Navigation,但我不确定如何获得这个特定功能: Demo from Samsung Health,其中有一个底部选项卡导航器,并且在每个选项卡屏幕的标题中都有一个菜单按钮,可以打开抽屉导航器,并且抽屉导航器中的每个选项都会打开一个堆栈导航器(所有选项卡都相同) ,即“主页”选项卡“为你”按钮打开与“在一起”选项卡完全相同的“为你”屏幕等)

我尝试了 stackNavigator、drawerNavigator 和 bottomTabNavigator 的各种组合,但没有一个以合理的方式运行,或者至少以我想要的方式运行。我做了一个基本的bottomTabNavigator,但我不知道在哪里放drawerNavigator;

const HomeStack = createStackNavigator({
  Home: HomeScreen
});
const NotifyStack = createStackNavigator({
  Notify: NotifyScreen
});
const ProfileStack = createStackNavigator({
  Profile: ProfileScreen
});
const SettingsStack = createStackNavigator({
  Settings: SettingsScreen
});

const DrawerStack1 = createStackNavigator({
  DrawerStack: DrawerScreen1
});
const DrawerStack2= createStackNavigator({
  DrawerStack: DrawerScreen2
});
const DrawerStack3 = createStackNavigator({
  DrawerStack: DrawerScreen3
});


const Drawer = createDrawerNavigator({
  DrawerStack1,
  DrawerStack2,
  DrawerStack3
});

const AppBottomTabs = createMaterialBottomTabNavigator({
  Home: HomeStack,
  Notify: NotifyStack,
  Profile: ProfileStack,
  Settings: SettingsStack
});

【问题讨论】:

    标签: react-native navigation navigation-drawer react-navigation


    【解决方案1】:

    我为您创建了示例项目,其中每个选项卡中有 3 个选项卡和抽屉。抽屉有选项(事件,ForYou),将打开单独的屏幕

    应用演示

    完整示例代码

    import React from 'react';
    import {View, Text, Image, TouchableOpacity} from 'react-native';
    import {createAppContainer} from 'react-navigation';
    import {createDrawerNavigator} from 'react-navigation-drawer';
    import {createStackNavigator} from 'react-navigation-stack';
    import {createBottomTabNavigator} from 'react-navigation-tabs';
    
    /*
    Components
    */
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
            <Text>Home!</Text>
          </View>
        );
      }
    }
    
    class Together extends React.Component {
      render() {
        return (
          <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
            <Text>Together</Text>
          </View>
        );
      }
    }
    
    class Discover extends React.Component {
      render() {
        return (
          <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
            <Text>Discover</Text>
          </View>
        );
      }
    }
    
    class Events extends React.Component {
      render() {
        return (
          <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
            <Text>Events</Text>
          </View>
        );
      }
    }
    
    class ForYou extends React.Component {
      render() {
        return (
          <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
            <Text>ForYou</Text>
          </View>
        );
      }
    }
    
    class DrawerComponent extends React.Component {
      drawerOptions = [
        {title: 'For you', route: 'ForYou'},
        {title: 'Events', route: 'Events'},
      ];
    
      render() {
        return (
          <View style={{flex: 1, marginTop: 60}}>
            {this.drawerOptions.map(item => (
              <TouchableOpacity
                style={{padding: 16}}
                onPress={() => {
                  this.props.navigation.toggleDrawer();
                  this.props.navigation.navigate(item.route);
                }}
                key={item.title}>
                <Text>{item.title}</Text>
              </TouchableOpacity>
            ))}
          </View>
        );
      }
    }
    
    /*
    Navigator
    */
    const TabNavigator = createStackNavigator(
      {
        TabsStack: {
          screen: createBottomTabNavigator({
            HomeScreen,
            Together,
            Discover,
          }),
        },
      },
      {
        defaultNavigationOptions: ({navigation}) => ({
          title: 'SamSung Health',
          headerLeft: (
            <TouchableOpacity
              style={{padding: 16}}
              onPress={() => navigation.toggleDrawer()}>
              <Image
                source={require('./drawer.png')}
                style={{width: 30, height: 30}}
              />
            </TouchableOpacity>
          ),
        }),
      },
    );
    
    const DrawerNavigator = createDrawerNavigator(
      {
        Home: {
          screen: TabNavigator,
        },
      },
      {drawerType: 'slide', contentComponent: DrawerComponent},
    );
    
    DrawerNavigator.navigationOptions = {
      header: null,
    };
    
    const AppNavigator = createStackNavigator({
      Home: {
        screen: DrawerNavigator,
      },
      Events,
      ForYou,
    });
    
    const AppContainer = createAppContainer(AppNavigator);
    
    // render App Component
    export default class App extends React.Component {
      render() {
        return (
          <View style={{flex: 1}}>
            <AppContainer />
          </View>
        );
      }
    }
    
    

    小吃链接:https://snack.expo.io/@mehran.khan/3d6749(请在 Android/IOS 中查看)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多