【问题标题】:In React Native how to navigate between screens?在 React Native 中如何在屏幕之间导航?
【发布时间】:2018-07-14 23:06:48
【问题描述】:

我正在使用 React 导航。我需要从 screen1 导航到 screen2。我创建了包含一些屏幕但不包含 screen1 的选项卡导航。当我单击 screen1 中的按钮转到 screen2 时,该按钮应显示在选项卡式屏幕中,它显示错误。

这是 screen1(Main.js)

import React, { Component } from 'react';
import {
  ImageBackground,
  StyleSheet,
  Text,
  View,
  Modal
} from 'react-native';
import { Container, Header, Left, Content, Footer, FooterTab, Icon, Grid, Row, Button } from 'native-base';
import TabNav from '../screens/Dashboard';
import { Dashboard } from '../screens/Dashboard';

export default class Main extends Component<{}> {
  render() {
    return (
      <Container>
          <Grid>
            <Row size={2}>
            <View style={{alignItems: 'center', flexDirection: 'column', flex: 1,  justifyContent: 'space-around' }}>
              <View style={{flexDirection: 'row', alignItems: 'center', justifyContent: 'center'}}>
                <Button style={styles.buttonBrowseStyle} onPress={() => this.props.navigation.navigate('Dashboard')}>
                  <Text>Browse</Text>
                </Button>
              </View>
            </View>
            </Row>
          </Grid>
      </Container>
    );
  }
}

这是 screen2(Dashboard.js)

import React from 'react';
import { Text } from 'react-native';
import { TabNavigator, TabBarBottom } from 'react-navigation';
import Post from './Post';

export const Dashboard = () => {
    return (<Text>Dashboard</Text>);
}

const TabNav = TabNavigator ({
    Dashboard: {
      screen: Dashboard,
    },
    Post: {
      screen: Post,
    },
  },
  { 
    tabBarComponent: TabBarBottom,
    tabBarPosition: 'bottom',
    swipeEnabled: false,
    animationEnabled: true,
    activeBackgroundColor: 'yellow',
    tabBarOptions: {
      activeTintColor: 'tomato',
      inactiveTintColor: 'gray',
    },
    tabBarIcon: ({focused, tintColor}) => {
      const { routeName } = navigation.state;
      let iconName;
      if(routeName==='Main'){
  
      }
    }
  }
  );
  
export default TabNav;

点击“浏览”按钮时出现此错误。

【问题讨论】:

  • 您似乎没有在任何地方使用TabNav。此外,Main 不在导航树中。我认为您需要更仔细地阅读文档。
  • @Kraylog 我在 screen1(Main.js) 中包含了 TabNav,但它不提供任何导航道具。我也不想在 TabNav 中提及我的 Main.js,因为它会与其他选项卡创建一个新选项卡。
  • 导航道具仅提供给在导航器中配置的屏幕。由于Main 不在任何导航器中,因此它没有获得该道具。要解决这个问题,您必须重新考虑导航树的结构。

标签: react-native react-navigation


【解决方案1】:

正如上面提到的答案,您没有在导航中包含主组件,因此,您基本上可以认为它们没有相互连接。

我建议您使用 PrimaryNavigator,您可以将其视为主要组件。

const PrimaryNavigator = StackNavigator({
    SignInStack: {
        screen: SignInStackNavigator
    },
    SignUpStack: {
        screen: SignUpStackNavigator
    },
    DrawerMainStack: {
        screen: MenuDrawerStack
    }
},
    {
        headerMode: 'none'
    });

下一步,您可以使用 TabNavigator,如下所示。

const MenuDrawerStack = StackNavigator({
    DrawerBar: {
        screen: DrawerBar
    }
}, {
        style: {
            leftDrawerWidth: 40
        },
        index: 0,
        navigationOptions: ({ navigation }) => ({
            headerStyle: { backgroundColor: '#1874CD' },
            gesturesEnabled: false,
            headerLeft: <Icon
                name="menu"
                onPress={() => {
                    navigation.navigate({
                        key: null,
                        index: 0,
                        action: [
                            navigation.navigate('DrawerToggle')
                        ]
                    })
                }}
            />
        }),
    })

最后,您可以构建您的标签导航器:

const DrawerBar = DrawerNavigator({
    Shop: {
        screen: ShopTabNavigator
    },

}, {
        drawerPosition: 'left',
        headerMode: 'none',
        initialRouteName: 'Shop',
        navigationOptions: ({ navigation }) => ({
            headerStyle: { backgroundColor: 'white' },
        }),
        contentComponent: props => <CustomDrawerMenu {...props} />,
        drawerOpenRoute: 'DrawerOpen',
        drawerCloseRoute: 'DrawerClose',
        drawerToggleRoute: 'DrawerToggle'
    })

您应该自定义这些,但我想向您展示的是,在 React Native 中使用 react-navigation 进行导航的方法与我在上面向您展示的非常相似。

最后,您必须将 PrimaryNavigator 作为高阶组件传递给您的应用程序。

export default class Main extends Component<{}> {
  render() {
    return (
      <PrimaryNavigator />
    );
  }
}

【讨论】:

    【解决方案2】:

    Main 应该是 StackNavigator 的一部分。导航道具在 Main 中不可用,因为它不是任何 Navigator 配置中的屏幕。

    【讨论】:

    • 我认为您的意思是 TabNavigator,因为我使用的是 Tab 而不是 Stack Navigator。如果我在 TabNavigator 中使用主屏幕,那么如何隐藏它以使其不显示在导航栏中。我不想在导航栏中显示主屏幕。
    • 这就是你应该使用 StackNavigator 的原因。将屏幕 1 和屏幕 2 (TabNav) 放在 StackNavigator 中,以便在它们之间来回导航。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2021-08-29
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多