嵌套导航时重用 Stack with Group
Reusing Stack with Group when nesting Navigation
使用 React Navigation 6,in the documentation,他们建议您使用组来最小化嵌套导航器。
但是我不确定如何在这个例子中做到这一点,在选项卡导航器中使用嵌套堆栈:
import * as React from 'react';
import { View, Button } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
function FeedScreen({ navigation }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Button
title="Go to Settings"
onPress={() => navigation.navigate('Settings')}
/>
</View>
);
}
function ProfileScreen() {
return <View />;
}
function SettingsScreen() {
return <View />;
}
const FeedStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<FeedStack.Navigator>
<FeedStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</FeedStack.Navigator>
);
}
const ProfileStack = createNativeStackNavigator();
function ProfileStackScreen() {
return (
<ProfileStack.Navigator>
<ProfileStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</ProfileStack.Navigator>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</Tab.Navigator>
);
}
const RootStack = createNativeStackNavigator();
export default function App() {
return (
<NavigationContainer>
<RootStack.Navigator>
<RootStack.Screen
name="Home"
component={HomeTabs}
options={{ headerShown: false }}
/>
<RootStack.Screen name="Settings" component={SettingsScreen} />
</RootStack.Navigator>
</NavigationContainer>
);
}
当我重复使用堆栈时,在选项卡导航器中只使用了一个,它仍然有效:
const TabStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<TabStack.Navigator>
<TabStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</TabStack.Navigator>
);
}
function ProfileStackScreen() {
return (
<TabStack.Navigator>
<TabStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</TabStack.Navigator>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</Tab.Navigator>
);
}
然而,当我尝试像这样使用组时:
const TabStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<TabStack.Group>
<TabStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</TabStack.Group>
);
}
function ProfileStackScreen() {
return (
<TabStack.Group>
<TabStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</TabStack.Group>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<TabStack.Navigator>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</TabStack.Navigator>
</Tab.Navigator>
);
}
我收到错误 a navigator can only contain 'screen' 'group' or 'react.fragment'
,因为如果不在 component
.
中写入导航器,则无法在另一个导航器中安装导航器
有没有办法在这里使用组,或者是为每个“组”编写 <TabStack.Navigator></TabStack.Navigator>
的正确方法?
这里的问题是 Group
是由 navigator
返回的组件。如果我们创建一个 returns 该组的 JSX 组件,那么这在技术上不再是 Group
而是它自己的 JSX 组件。
这是 react-native-navigation
中的一个未解决问题,并在 in this GitHub issue 中进行了讨论,但除了丑陋的 hack 之外显然没有令人满意的解决方案。
我们可以内联调用功能组件。
function CustomGroupComponent() {
return <Tab.Group>
<Tab.Screen ... />
<Tab.Screen ... />
</Tab.Group>
}
export const Tabs = (props) => {
return (
<Tab.Navigator ...>
<Tab.Screen ...>
{CustomGroupComponent()}
</Tab.Navigator>
)
}
综上所述,没有完美的解决方案。诀窍是使用 {CustomGroupComponet()}
.
将功能组件调用为内联函数
备注:我认为这是一个anti-pattern,但目前版本中没有其他解决方案。
使用 React Navigation 6,in the documentation,他们建议您使用组来最小化嵌套导航器。
但是我不确定如何在这个例子中做到这一点,在选项卡导航器中使用嵌套堆栈:
import * as React from 'react';
import { View, Button } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
function FeedScreen({ navigation }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Button
title="Go to Settings"
onPress={() => navigation.navigate('Settings')}
/>
</View>
);
}
function ProfileScreen() {
return <View />;
}
function SettingsScreen() {
return <View />;
}
const FeedStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<FeedStack.Navigator>
<FeedStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</FeedStack.Navigator>
);
}
const ProfileStack = createNativeStackNavigator();
function ProfileStackScreen() {
return (
<ProfileStack.Navigator>
<ProfileStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</ProfileStack.Navigator>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</Tab.Navigator>
);
}
const RootStack = createNativeStackNavigator();
export default function App() {
return (
<NavigationContainer>
<RootStack.Navigator>
<RootStack.Screen
name="Home"
component={HomeTabs}
options={{ headerShown: false }}
/>
<RootStack.Screen name="Settings" component={SettingsScreen} />
</RootStack.Navigator>
</NavigationContainer>
);
}
当我重复使用堆栈时,在选项卡导航器中只使用了一个,它仍然有效:
const TabStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<TabStack.Navigator>
<TabStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</TabStack.Navigator>
);
}
function ProfileStackScreen() {
return (
<TabStack.Navigator>
<TabStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</TabStack.Navigator>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</Tab.Navigator>
);
}
然而,当我尝试像这样使用组时:
const TabStack = createNativeStackNavigator();
function FeedStackScreen() {
return (
<TabStack.Group>
<TabStack.Screen name="Feed" component={FeedScreen} />
{/* other screens */}
</TabStack.Group>
);
}
function ProfileStackScreen() {
return (
<TabStack.Group>
<TabStack.Screen name="Profile" component={ProfileScreen} />
{/* other screens */}
</TabStack.Group>
);
}
const Tab = createBottomTabNavigator();
function HomeTabs() {
return (
<Tab.Navigator screenOptions={{headerShown: false}}>
<TabStack.Navigator>
<Tab.Screen name="Feed" component={FeedStackScreen} />
<Tab.Screen name="Profile" component={ProfileStackScreen} />
</TabStack.Navigator>
</Tab.Navigator>
);
}
我收到错误 a navigator can only contain 'screen' 'group' or 'react.fragment'
,因为如果不在 component
.
有没有办法在这里使用组,或者是为每个“组”编写 <TabStack.Navigator></TabStack.Navigator>
的正确方法?
这里的问题是 Group
是由 navigator
返回的组件。如果我们创建一个 returns 该组的 JSX 组件,那么这在技术上不再是 Group
而是它自己的 JSX 组件。
这是 react-native-navigation
中的一个未解决问题,并在 in this GitHub issue 中进行了讨论,但除了丑陋的 hack 之外显然没有令人满意的解决方案。
我们可以内联调用功能组件。
function CustomGroupComponent() {
return <Tab.Group>
<Tab.Screen ... />
<Tab.Screen ... />
</Tab.Group>
}
export const Tabs = (props) => {
return (
<Tab.Navigator ...>
<Tab.Screen ...>
{CustomGroupComponent()}
</Tab.Navigator>
)
}
综上所述,没有完美的解决方案。诀窍是使用 {CustomGroupComponet()}
.
备注:我认为这是一个anti-pattern,但目前版本中没有其他解决方案。