如何使用 useNavigation() 在与 typescript 的本机反应中导航到屏幕

Posted

技术标签:

【中文标题】如何使用 useNavigation() 在与 typescript 的本机反应中导航到屏幕【英文标题】:How to navigate to a screen using useNavigation() in react native with typescript 【发布时间】:2021-09-13 13:18:15 【问题描述】:

我想使用useNavigation 导航到屏幕。 以下是我的代码:

MainNav.tsx:

const defaultNavigationOptions: StackNavigationOptions = 
    ...
    ...
    ...
    headerRight: (props) => 
        return <AccountHeaderComponent tintColor=props.tintColor />;
    ,
    ...
    ...
    ...
;


const MainNavigator = () => 
return (
        <MainStack.Navigator>
            <MainStack.Screen
                name="VerificationScreen
                component=VerificationScreen
            />
        </MainStack.Navigator>
    );
;

这创建了一个带有配置文件图标的标题,如下图所示。

点击后会跳转到组件AccountHeaderComponent

AccountHeaderComponent.tsx:

import AccountsPopUpComponent from "./AccountsPopUpComponent";

export interface AccountHeaderComponentProps 
    tintColor?: string,

const AccountHeaderComponent = (props: AccountHeaderComponentProps) => 
    const tintColor = props;
    return (<>
          <Modal>
              <AccountsPopUpComponent/>
          </Modal>
          <TouchableOpacity>
              <View>
                  <Icon name='account-outline'/>
              </View>
          </TouchableOpacity>
      </>
        </>
    )
;

请注意,这里有一个名为 AccountsPopUpComponent 的组件

AccountsPopUpComponent.tsx:

const AccountsPopUpComponent = (props: any) => 
    const onClose = props;

    const getCurrentPage = () => 
        switch (page) 
            case '':
                return <ProfileComponent />
            default:
                return <DummyComponent/>
        
    

    return (
          <View style=flex: 1>getCurrentPage()</View>
    )
;

最后我有一个ProfileComponent,我想从中导航到VerificationScreen,它位于主导航器中。

ProfileComponent.tsx:

const ProfileComponent = (props: ProfileComponentProps) => 
  const navigation = useNavigation();

  const gotoVerifyScreen= () => 
    navigation.navigate(VerificationScreen);
  ;

  return (
    <>
          <VerifyRibbonComponent
            gotoOTP=gotoVerifyScreen
          />
    </>
  );
;

gotoVerifyScreen 这里我使用useNavigation 去验证屏幕,它不会带我到那个屏幕,但是如果我点击我设备的返回按钮然后我可以看到那个屏幕。这不是我想要的那种功能。当我点击VerifyRibbonComponent 时,我想看到那个屏幕。我已经很努力了,但找不到我正在做的错误

【问题讨论】:

【参考方案1】:

如果您在导航堆栈的标题中使用组件,则应使用来自 props 的导航而不是 useNavigation(我找不到有关它的文档)。

尝试用const navigation = props.navigation;替换const navigation = useNavigation();

const defaultNavigationOptions: StackNavigationOptions = 
    ...
    ...
    ...
    headerRight: (props) => 
        return <AccountHeaderComponent 
           ...props // <--- ADD THIS
           tintColor=props.tintColor />;
    ,
    ...
    ...
    ...
;
const AccountHeaderComponent = (props: AccountHeaderComponentProps) => 
    const tintColor = props;
    return (<>
          <Modal>
              <AccountsPopUpComponent 
                ...props // <--- ADD THIS
              />
          </Modal>
          <TouchableOpacity>
              <View>
                  <Icon name='account-outline'/>
              </View>
          </TouchableOpacity>
      </>
        </>
    )
;
const AccountsPopUpComponent = (props: any) => 
    const onClose = props;

    const getCurrentPage = () => 
        switch (page) 
            case '':
                return <ProfileComponent ...props /> // <--- ADD THIS
            default:
                return <DummyComponent ...props /> // <--- ADD THIS
        
    

    return (
          <View style=flex: 1>getCurrentPage()</View>
    )
;
const ProfileComponent = (props: ProfileComponentProps) => 
  const gotoVerifyScreen= () => 
    props.navigation.navigate(VerificationScreen); // <--- CHANGE HERE
  ;

  return (
    <>
          <VerifyRibbonComponent
            gotoOTP=gotoVerifyScreen
          />
    </>
  );
;

【讨论】:

为此,我必须将导航作为道具传递给所有组件,我不想这样做 只针对导航头部的组件。 useNavigation 将适用于所有其他组件 它不工作Property 'navigation' does not exist on type 'ProfileComponentProps'. 我更新了答案。您没有从 react-navigation 传递原始道具

以上是关于如何使用 useNavigation() 在与 typescript 的本机反应中导航到屏幕的主要内容,如果未能解决你的问题,请参考以下文章

找不到导航对象。您的组件是不是在导航器的屏幕内?

如何使用 Storybook 构建具有外部挂钩的屏幕?

在与 nodemon 相关的 heroku 触发错误上部署节点应用程序

从第三方库挂钩返回函数的间谍

使用 react-navigation 中的 useRoute 进行 Jest 单元测试

我们如何在与 joblib 的并行执行中使用 tqdm?