react-navigation:从标题中的按钮导航到不同的屏幕

Posted

技术标签:

【中文标题】react-navigation:从标题中的按钮导航到不同的屏幕【英文标题】:react-navigation: Navigate to a different screen from a button in header 【发布时间】:2020-04-05 18:49:23 【问题描述】:

我的标题右侧有一个图标,按下该按钮我想导航到不同的屏幕。

我对此进行了很多搜索,但是所有解决方案都是针对类组件的,并且没有可用的官方文档。

我正在使用 react native 版本 0.61.4。

按下右侧标题中的图标时,我想移动“ProfileScreen”。所有其他导航工作正常。我在“HomeScreen”中有一个按钮可以移动到“ResultsScreen”,但无法从标题转到“ProfileScreen”。

这是我的代码的 sn-p

const Stack = createStackNavigator();

const App = () => 
    return (
        <SafeAreaView style= flex: 1 >
            <NavigationContainer>
                <Stack.Navigator>
                    <Stack.Screen 
                        name="Home" 
                        component=HomeScreen
                        options=
                            
                                title: 'Home',
                                headerStyle: 
                                    backgroundColor: '#273469',
                                ,
                                headerTintColor: '#EBF2FA',
                                headerRight: () => (
                                    <Icon
                                      onPress=() => navigate('ProfileScreen')
                                      name="edit"
                                      type="material"
                                    />
                                ),
                            
                        
                    />
                    <Stack.Screen 
                        name="ResultsScreen" 
                        component=ResultsScreen
                    />
                    <Stack.Screen 
                        name="ProfileScreen"
                        component=ProfileScreen
                    />
                </Stack.Navigator>
            </NavigationContainer>
        </SafeAreaView>
    )

【问题讨论】:

【参考方案1】:

options 可以将函数作为参数,而该函数将props 作为参数。

这里是documentation

这里是 TypeScript 定义的信息:

     * Navigator options for this screen.
     */
    options?: ScreenOptions | ((props: 
        route: RouteProp<ParamList, RouteName>;
        navigation: any;
    ) => ScreenOptions);

如您所见,包含 navigation 对象,您可以使用它来调用导航,如下所示:

 options=( navigation ) => (
              title: 'Home',
              headerStyle: 
                backgroundColor: '#273469',
              ,
              headerTintColor: '#EBF2FA',
              headerRight: () => (
                <Icon
                  onPress=() => navigation.navigate('ProfileScreen')
                  name="edit"
                  type="material"
                />
              ),
            )

【讨论】:

花了我一段时间才找到它 :) 为什么我们在 ( navigation ) => 之后使用 "(" @hakiko。 () return 的语法糖。在此示例中,它与 navigation ) =&gt; return title.... 相同 options=(navigation) =&gt; ( headerTitle: &lt;HeaderComponent navigation=navigation /&gt; ) 在我尝试向自定义标题组件添加导航时不起作用 奇怪的是我的导航是任何类型的。【参考方案2】:

除了凯文的回答,你还可以在标题中添加一个简单的按钮:

 options=( navigation ) => (
              title: 'Home',
              headerStyle: 
                backgroundColor: '#273469',
              ,
              headerTintColor: '#EBF2FA',
              headerRight: () => (
                <Button                // a button in the header!     
                  onPress=() => 
                  navigation.navigate('Account')
                  title="Account"
                />
              ),
            )

【讨论】:

以上是关于react-navigation:从标题中的按钮导航到不同的屏幕的主要内容,如果未能解决你的问题,请参考以下文章

React-native 组件缓存(或防止卸载)(react-navigation)

最新版 react-navigation v5.0 上带有标题按钮的换屏

iOS15 中后退按钮的 headerTintColor 被忽略(react-navigation v5)

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

react-navigation withNavigation 返回 undefined

如何使用 react-navigation 推送新场景?