【问题标题】:How to hide Tab conditionally in react-navigation?如何在反应导航中有条件地隐藏选项卡?
【发布时间】:2020-02-18 17:59:30
【问题描述】:

如果用户登录,我想有条件地隐藏我的一个标签,

所以我有 5 个选项卡如果用户登录\注册我从 redux 商店得到一个布尔值, 如果这个用户登录我想要一个“库选项卡”如果没有登录,我不想与其他人一起显示这个选项卡“库”并且只在应用程序中保留 4 个选项卡

代码

import {createAppContainer} from 'react-navigation';
import {createBottomTabNavigator} from 'react-navigation-tabs';

let {isLogin} = store.getState().user;


const TabHome = createBottomTabNavigator(
  {
    Home: {
      screen: Home,
      navigationOptions: {
        tabBarLabel: 'Home',
      },
    },
    Browse: {
      screen: Browse,
      navigationOptions: {
        tabBarLabel: 'Browse',
      },
    },
    Search: {
      screen: Search,
      navigationOptions: {
        tabBarLabel: 'Search',
        headerShown: false,
      },
    },
    Radio: {
      screen: Radio,
      navigationOptions: {
        tabBarLabel: 'Radio',
      },
    },
    Library: isLogin ? (
      {
        screen: YourLibrary,
        navigationOptions: {
          tabBarLabel: 'Library',
        },
      }
    ) : (
      <View /> // Or :null => Not work and got the under error msg
    ),
    // Library: {
    //   screen: YourLibrary,
    // },
  },
)

export default createAppContainer(TabHome);

错误:路由“库”的组件必须是 React 组件。 例如:

从'./MyScreen'导入我的屏幕; ...库:MyScreen,}

您也可以使用导航器:

从'./MyNavigator'导入MyNavigator; ... 库:MyNavigator,}

【问题讨论】:

    标签: javascript react-native react-native-android react-navigation


    【解决方案1】:

    在 React Navigation v5 中:

    import * as React from 'react';
    import { Text, View } from 'react-native';
    import { NavigationContainer } from '@react-navigation/native';
    import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
    import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
    
    function HomeScreen(props) {
      return (
        <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
          <Text>Home!</Text>
        </View>
      );
    }
    
    function SettingsScreen() {
      return (
        <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
          <Text>Settings!</Text>
        </View>
      );
    }
    
    function AboutScreen() {
      return (
        <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
          <Text>About!</Text>
        </View>
      );
    }
    
    const Tab = createBottomTabNavigator();
    
    function MyTabs() {
      const [showTab, setShowTab] = React.useState(true);
    
      // Show the about tab after 5 seconds.
      // Change this to use Redux or however
      // you would like to change which tabs are displayed
      setTimeout(() => {
        setShowTab(false);
        console.log('Hide tab');
      }, 5000);
    
      return (
        <Tab.Navigator>
          <Tab.Screen
            name="Home"
            component={HomeScreen}
            options={{
              tabBarLabel: 'Home',
              tabBarIcon: ({ color, size }) => (
                <MaterialCommunityIcons name="home" color={color} size={size} />
              ),
            }}
          />
          {showTab ? (
            <Tab.Screen
              name="About"
              component={AboutScreen}
              options={{
                tabBarLabel: 'About',
                tabBarIcon: ({ color, size }) => (
                  <MaterialCommunityIcons name="book" color={color} size={size} />
                ),
              }}
            />
          ) : null}
          <Tab.Screen
            name="Settings"
            component={SettingsScreen}
            options={{
              tabBarLabel: 'Settings',
              tabBarIcon: ({ color, size }) => (
                <MaterialCommunityIcons name="settings" color={color} size={size} />
              ),
            }}
          />
        </Tab.Navigator>
      );
    }
    
    export default function App() {
      return (
        <NavigationContainer>
          <MyTabs />
        </NavigationContainer>
      );
    }
    

    世博会示例https://snack.expo.io/@jackvial/createbottomtabnavigator-%7C-react-navigation-v5

    【讨论】:

    • UH old days :"D,是的,这是 V5 中的完美方式,这就是我正在做的事情:"D 我只是忘记在这里提供答案所以谢谢杰克,它工作得很好,但请注意当我在ios 设备中检查博览会示例时,它没有出现 IDK 为什么!但网络它运作良好
    • 不客气!我有一种感觉,你现在已经明白了:D。 v5 是一个很大的改进,目前使用 v3 更新我的管道胶带解决方案。嗯,没有看到 iOS 的问题,我在 mac 上运行 chrome。
    • 反应导航v4有什么办法吗?
    • @GWANHUIKIM 在反应导航 v4 中,我的解决方案是创建两个选项卡栏并使用反应上下文或 redux 在渲染每个选项卡栏之间切换。每个标签栏可以有不同的标签。
    【解决方案2】:

    您知道您可以覆盖 Tabbar 组件并为其添加自己的逻辑吗? 也许这会给你一个想法:https://stackoverflow.com/a/58520533/1256697

    也许这样,您可以设置条件样式来显示或隐藏 TabBar 的单个项目。

    【讨论】:

      【解决方案3】:

      TabHome 中删除Library 选项卡定义并在导出组件之前添加它:

      if(isLogin) {
        TabHome.Library = {
          screen: YourLibrary,
          navigationOptions: {
            tabBarLabel: 'Library',
          }
        }
      }
      
      export default createAppContainer(TabHome)
      

      【讨论】:

      • 嘿@farhad,感谢您的回复,但遗憾的是不起作用,如果条件为真/假,它只是隐藏的标签
      猜你喜欢
      • 2018-03-27
      • 2020-09-10
      • 1970-01-01
      • 2021-05-02
      • 2019-05-05
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多