react-native - React Navigation (V2 / V3):如何在屏幕上的 navigationOptions 中访问 navigation.state.index
问题描述
我正在构建一个 React Native 应用程序,对于我的导航,我使用 React Navigation (V3)。对于我的 UI 元素,我使用 React Native Elements。
我有一个屏幕,可以在多个导航器中重复使用。有时它位于堆栈的根部,有时它被堆栈推动。我想根据其在堆栈中的位置以编程方式将一个headerLeft
元素添加到此屏幕navigationOptions
,因为如果屏幕位于堆栈的根部,我要么希望显示默认的后退按钮,要么显示汉堡菜单图标(因为堆栈嵌套在抽屉中)。
所以我尝试了以下方法:
export class ScannerScreen extends Component {
static navigationOptions = ({ navigation }) => ({
headerLeft:
navigation.state.index > 0 ? (
undefined
) : (
<Icon type="ionicon" name="ios-menu" onPress={navigation.toggleDrawer} />
),
title: strings.scannerTitle
});
// ...
navigation.state.index
问题是这在这里不起作用undefined
。使用 React 导航如何做到这一点?
编辑:
根据要求,我添加了console.log(navigation)
(通过<Icon />
s的屏幕截图onPress
。)
解决方案
我找到了一个hacky
解决方案,没关系,但我也有点不喜欢它:
const stackConfig: StackNavigatorConfig = {
cardStyle: styles.card,
navigationOptions: {
headerBackTitleStyle: styles.headerBackTitle,
headerStyle: styles.header,
headerTintColor: "black"
}
};
const HomeStack = createStackNavigator(
{ HomeScreen, RestaurantDetailScreen, MenuScreen, ScannerScreen },
{
...stackConfig,
initialRouteName: "HomeScreen",
navigationOptions: ({ navigation }) => ({
headerLeft:
parseFloat(navigation.state.key.slice(-1)) > 1 ? (
undefined
) : (
<Icon
containerStyle={styles.leftIcon}
type="ionicon"
name={getIconName("menu")}
onPress={navigation.toggleDrawer}
/>
),
...stackConfig.navigationOptions
})
}
);
这样它会自动为整个堆栈设置它。您也可以在相应屏幕的各个导航选项中执行此操作。但这仅适用,因为屏幕的自动分配键包含它的索引。
推荐阅读
- java - java.lang.NoSuchMethodError : org.mockito.MockitoAnnotation.openMocks
- python - 如何从 django 模型中打印过滤后的结果
- python - 如何阅读这个修改后的unet?
- python-3.x - 在 Beautiful Soup 中的一行中查找字符串
- python - 无法导入“pandas_profiling”模块
- python - 如何将元组列表列表(索引,值)转换为 2D numpy 数组
- laravel - required_if laravel request Id 的名字必须等于 value-Validation
- aws-api-gateway - AWS CDK:无法在 AWS API Gateway 集成响应中定义 Content-Type
- javascript - 如何通过javascript将样式-webkit-font-smoothing:antialiased添加到html元素?
- javascript - 如何正确地将变量从 Django 获取到 javascript 并在 Django URL 上执行 GET ajax 调用?