【问题标题】:React Navigation route.params typescript反应导航 route.params 打字稿
【发布时间】:2020-11-11 00:10:39
【问题描述】:

我正在使用 TypeScript 创建一个 Expo 托管的 React Native 应用程序,但在使用 React Navigation 和 TypeScript 时遇到了一些问题。

我想在 Tab.Screen 组件上指定底部选项卡导航器的图标。

此代码有效,但由于 route.params 可能未定义(第 10 行)而报错。

“对象”类型上不存在属性“图标”

我可以在 initialParams 上制作所需的图标道具吗?

我查看了文档没有任何运气。

const App: React.FC<{}> = () => {
  return (
    <SafeAreaView style={styles.container}>
      <NavigationContainer>
        <Tab.Navigator
          screenOptions={({ route }) => ({
            tabBarIcon: ({ size, color }) => (
              <MaterialIcons
                size={size}
/* ===> */      name={route.params.icon}
                color={color}
              />
            ),
          })}
        >
          <Tab.Screen
            name="EventListView"
            initialParams={{ icon: 'view-agenda' }}
            component={EventListScreen}
          />
          <Tab.Screen
            name="CreateEvent"
            initialParams={{ icon: 'public' }}
            component={SettingsScreen}
          />
        </Tab.Navigator>
      </NavigationContainer>
    </SafeAreaView>
  )
}

【问题讨论】:

    标签: reactjs typescript react-native react-navigation react-navigation-bottom-tab


    【解决方案1】:

    import { RouteProp } from '@react-navigation/native';

      route: RouteProp<{ params: { icon: ICON_TYPE } }, 'params'>
    

    我最近遇到了同样的问题,我想出了这个,它似乎工作正常。

    【讨论】:

      【解决方案2】:

      这样做的正确方法是使用参数定义一个类型,并在创建导航器时将其作为类型参数发送。像这样的:

      type TabNavigatorParamList = {
        EventListView: { icon: string }
        CreateEvent: { icon: string }
      }
      
      const Tab = createBottomTabNavigator<TabNavigatorParamList>(); //*
      
      

      * 我假设您的 Tab 组件是 BottomTabNavigator,但无论您使用哪种 create{whatever}Navigator,相同的代码都可以工作。

      就像您的 Tab.NavigatorTab.Screen 将为其 route 属性设置正确的类型。

      还有更多信息 in the docs,以及更高级的情况,例如注释钩子和嵌套导航器。

      【讨论】:

        【解决方案3】:

        我认为您可以使用以下语法:

        name={route.params?.icon}
        

        否则使用这个:

        name={route.params?.icon ?? 'defaultName'}
        

        根据文档,此语法可防止在某些情况下未定义参数,并在 params.someParam 未定义或为空时提供默认值。

        欲了解更多信息,请阅读此处:https://reactnavigation.org/docs/upgrading-from-4.x/#no-more-getparam

        【讨论】:

        • 感谢您的回答。我只是觉得这是围绕 TypeScript 工作的。我是一个完美的世界,我永远不应该被定义,但我想它可以完成这项工作。
        • 这只是可选的链接。如果您希望您的编辑在您打字时给出建议,那么 Robert 的上述回答是首选。
        猜你喜欢
        • 2020-11-20
        • 2021-06-18
        • 2020-10-12
        • 2022-08-24
        • 1970-01-01
        • 2022-11-25
        • 1970-01-01
        • 2021-06-25
        • 2021-11-01
        相关资源
        最近更新 更多