【问题标题】:Making navigation available to all components in React Native app使导航可用于 React Native 应用程序中的所有组件
【发布时间】:2020-10-04 03:04:42
【问题描述】:

我在我的React Native 应用程序中使用React Navigation 5,我不太清楚如何使导航对所有组件都可用。我还想提一下,我的应用使用Redux 进行状态管理,但我没有将React NavigationRedux 集成——也许我应该!

我的App.js 呈现我的Navigator.js 组件,如下所示。顺便说一句,我的应用程序需要身份验证,并且导航器功能的关键功能之一是将未经身份验证的用户重定向到登录屏幕。

class Navigator extends Component {

   render() {
        return (
            <NavigationContainer>
                {
                   this.props.isAuthenticated
                   ? <MainMenuDrawer.Navigator drawerContent={(navigation) => <DrawerContent member={this.props.member} navigation={navigation} drawerActions={DrawerActions} handleClickLogOut={this.handleClickLogOut} />}>
                       <MainMenuDrawer.Screen name="Home" component={HomeStack} />
                       <MainMenuDrawer.Screen name="ToDoList" component={ToDoListStack} />
                     </MainMenuDrawer.Navigator>
                   : <SignInStack />
                }
            </NavigationContainer>
        );
      }
}

然后在我的HomeStack 中,我有我的Dashboard 组件,它恰好是一个需要访问navigation 的类组件。这是我的HomeStack

const HomeStackNav = new createStackNavigator();

const HomeStack = () => {

   return(
      <HomeStackNav.Navigator screenOptions={{ headerShown: false }}>
         <HomeStackNav.Screen name="DashboardScreen" component={Dashboard} />
         <HomeStackNav.Screen name="SomeOtherScreen" component={SomeOtherComponent} />
      </HomeStackNav.Navigator>
   );
}

export default HomeStack;

说,我的Dashboard 组件如下所示。如何使 navigation 可用于此组件?

class Dashboard extends Component {

   handleNav() {

      // Need to use navigation here...
   }

   render() {
      return (
         <Text>Welcome to Dashboard</Text>
         <Button onPress={() => this.handleNav()}>Go somewhere</Button>
      );
   }
}

function mapStateToProps(state) {
    return {
        member: state.app.member
    };
}

function mapDispatchToProps(dispatch) {

    return {
        actions: bindActionCreators(appActions, dispatch)
    };
}

export default connect(mapStateToProps, mapDispatchToProps)(Dashboard);

我需要手动将navigation 传递给每个组件吗?这似乎太重复并且容易出错。如何使navigation 在我的整个应用中可用?

【问题讨论】:

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


    【解决方案1】:

    解决方案 1:

    你可以使用useNavigation钩子作为功能组件

    import {useNavigation} from '@react-navigation/native';
    
    
    const navigation = useNavigation();
    
    navigation.navigate("interests");
    //or
    navigation.push("interests");
    
    

    解决方案 2:

    您可以使用 HOC withNavigation 在类组件 Ref 的任何组件中的 props 中导航

    您可以通过

    安装@react-navigation/compat
    yarn add @react-navigation/compat
    

    你可以像下面这样导入

    import { withNavigation } from '@react-navigation/compat';
    

    你可以像下面这样使用withNavigation

    export default withNavigation(Dashboard)
    

    注意:然后您可以在仪表板组件中使用this.props.navigation

    【讨论】:

    • 感谢您的回复,但这不是解决方法吗? withNavigation@react-navigation/compat 包的一部分这一事实是否表明我们没有使用 v5 API?再次感谢您的回复。我只是想确保我按照 v5 API 标准正确处理这个问题。
    • 是的,您使用的是正确的方式。如果您无法获得导航道具,我只是给出了答案,那么您可以进入任何这样的组件
    • 你是对的。看起来我们要么使用@react-navigation/compat 包附带的withNavigation,要么根据文档,将一个类组件包装在一个看起来很奇怪的功能组件中,只是为了访问navigation 对象。 withNavigation 似乎是一种更清洁的方法。这是文档:reactnavigation.org/docs/use-navigation
    • @Sam useNavigation 是一个钩子,只能在功能组件中使用,不能在类基础组件中使用
    • 是的,我知道。这就是为什么文档建议我们将一个类组件包装在一个函数式组件中——参见文档的链接——这似乎不是一种干净的方法。这就是为什么我说,withNavigation 似乎是一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2015-06-02
    相关资源
    最近更新 更多