使用 React Navigation 6,在檔案中,他們建議您使用 Groups 來最小化嵌套導航器。
但是,我不確定如何在此示例中執行此操作,在選項卡導航器中使用嵌套堆疊:
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>
);
}
但是,當我嘗試像這樣使用 Group 時:
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>為每個“組”撰寫的正確方法?
uj5u.com熱心網友回復:
這里的問題是這Group是一個由navigator. 如果我們創建一個回傳該組的 JSX 組件,那么從技術上講,這Group不再是一個,而是它自己的 JSX 組件。
這是一個未解決的問題,react-native-navigation并在此 GitHub 問題中進行了討論,但顯然除了丑陋的 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()}.
備注:我認為這是一種反模式,但就我而言,當前版本中沒有其他解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451778.html
上一篇:Flatlist不呈現專案(ReactNative)
下一篇:React-Native-當我關閉一個像messenger這樣的應用程式時,我怎么可能仍然可以收到來自其他人的來電通知
