如何在 React Native 中混合两种类型的导航
How to mix two types of navigation in react native
我正在使用 React Native 开发一个应用程序。我想在我的应用程序上有一个底部导航 (5.x)。完成后,我还想让用户在其他用户的个人资料视图上导航。
但是,我不希望这个新屏幕出现在底部导航中。我不知道该怎么做。我是否需要混合使用堆栈导航和底部导航?怎么做 ?
我添加了一个底部标签导航器,如下所示:
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import DetailsScreen from '../Screens/DetailsScreen';
import HomeScreen from '../Screens/HomeScreen';
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import TestScreen from '../Screens/TestScreen';
import {StyleSheet} from 'react-native';
const Tab = createBottomTabNavigator();
export default class Navigation {
render() {
return (
<NavigationContainer style={styles.navigationContainer}>
<Tab.Navigator style={styles.tabNavigator}>
<Tab.Screen style={styles.tabScreen} name="Detail" component={DetailsScreen} />
<Tab.Screen style={styles.tabScreen} name="Home" component={HomeScreen} />
<Tab.Screen style={styles.tabScreen} name="Test" component={TestScreen} hide={true} />
</Tab.Navigator>
</NavigationContainer>
);
}
}
const styles = StyleSheet.create({
});
这很好用!之后,我在我的主屏幕中添加了一个堆栈导航器(以便通过不在选项卡导航器中的屏幕进行导航)。
但是,它不能正常工作,因为它分割了我的屏幕。我的堆栈导航器如下所示:
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from '../Screens/HomeScreen';
import DetailsScreen from '../Screens/DetailsScreen';
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
const Stack = createStackNavigator();
export default function StackNavigation() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
导入后,我将这两个文件添加到我的 App 文件中,就像使用标签和一样。
import ....
class App extends React.Component{
render(){
return (
<View style={styles.container}>
<Navigation />
<StackNavigation />
</View>
);
}
};
ReactNative 为此使用嵌套导航器。
您将为所需的每种导航类型创建 2 个单独的组件,然后将辅助导航器作为屏幕传递到主导航器,组件属性值是要传递的导航器。
正在传递的导航器不应被 NavigationContainer 包围,因为那样会引发错误,指出容器已提供或类似内容。
如您所说,在 App.js 中将其中两个作为单独的组件传递会创建分屏。 @Thomsath
有关详细信息,请参阅此 link:https://reactnavigation.org/docs/nesting-navigators/
这张图片也取自上面的 link。
正如 react-navigation 文档所说,嵌套导航不是一个好的用法,但你可以在 react-navigation 的 5.x 版本中做到这一点,正如其他人的回答所说。
但是,如果你愿意,你可以使用 react-navigation 4.x 来做得更好,比如将 stack-navigatior 与 bottom-navigator 混合使用,如下图所示。
按照代码去做:
yarn add react-navigation
如果您运行正在创建一个裸反应本机项目,运行下面的代码
yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view
如果您正在 运行 一个展览项目,运行 这个:
expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
然后,要完成依赖项安装,运行:
yarn add react-navigation-tabs
您可以继续阅读版本 4.x 的文档以完成其他一些细节。
下图显示了嵌套导航器的结构。
给个更好的解释,这段代码会先打开route(screen) name SignIn,如果prop SignedIn为true,那么Dashboard route会打开。
当然最好使用最新的稳定版本,因为它是 5.x,并遵循文档的提示和建议。
希望这有帮助。
我正在使用 React Native 开发一个应用程序。我想在我的应用程序上有一个底部导航 (5.x)。完成后,我还想让用户在其他用户的个人资料视图上导航。 但是,我不希望这个新屏幕出现在底部导航中。我不知道该怎么做。我是否需要混合使用堆栈导航和底部导航?怎么做 ?
我添加了一个底部标签导航器,如下所示:
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import DetailsScreen from '../Screens/DetailsScreen';
import HomeScreen from '../Screens/HomeScreen';
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import TestScreen from '../Screens/TestScreen';
import {StyleSheet} from 'react-native';
const Tab = createBottomTabNavigator();
export default class Navigation {
render() {
return (
<NavigationContainer style={styles.navigationContainer}>
<Tab.Navigator style={styles.tabNavigator}>
<Tab.Screen style={styles.tabScreen} name="Detail" component={DetailsScreen} />
<Tab.Screen style={styles.tabScreen} name="Home" component={HomeScreen} />
<Tab.Screen style={styles.tabScreen} name="Test" component={TestScreen} hide={true} />
</Tab.Navigator>
</NavigationContainer>
);
}
}
const styles = StyleSheet.create({
});
这很好用!之后,我在我的主屏幕中添加了一个堆栈导航器(以便通过不在选项卡导航器中的屏幕进行导航)。
但是,它不能正常工作,因为它分割了我的屏幕。我的堆栈导航器如下所示:
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from '../Screens/HomeScreen';
import DetailsScreen from '../Screens/DetailsScreen';
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
const Stack = createStackNavigator();
export default function StackNavigation() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
导入后,我将这两个文件添加到我的 App 文件中,就像使用标签和一样。
import ....
class App extends React.Component{
render(){
return (
<View style={styles.container}>
<Navigation />
<StackNavigation />
</View>
);
}
};
ReactNative 为此使用嵌套导航器。
您将为所需的每种导航类型创建 2 个单独的组件,然后将辅助导航器作为屏幕传递到主导航器,组件属性值是要传递的导航器。
正在传递的导航器不应被 NavigationContainer 包围,因为那样会引发错误,指出容器已提供或类似内容。
如您所说,在 App.js 中将其中两个作为单独的组件传递会创建分屏。 @Thomsath
有关详细信息,请参阅此 link:https://reactnavigation.org/docs/nesting-navigators/
这张图片也取自上面的 link。
正如 react-navigation 文档所说,嵌套导航不是一个好的用法,但你可以在 react-navigation 的 5.x 版本中做到这一点,正如其他人的回答所说。 但是,如果你愿意,你可以使用 react-navigation 4.x 来做得更好,比如将 stack-navigatior 与 bottom-navigator 混合使用,如下图所示。 按照代码去做:
yarn add react-navigation
如果您运行正在创建一个裸反应本机项目,运行下面的代码
yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view
如果您正在 运行 一个展览项目,运行 这个:
expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
然后,要完成依赖项安装,运行:
yarn add react-navigation-tabs
您可以继续阅读版本 4.x 的文档以完成其他一些细节。
下图显示了嵌套导航器的结构。
给个更好的解释,这段代码会先打开route(screen) name SignIn,如果prop SignedIn为true,那么Dashboard route会打开。 当然最好使用最新的稳定版本,因为它是 5.x,并遵循文档的提示和建议。 希望这有帮助。