如何使用React Native导航有条件地渲染headerLeft?

j2datikz  于 2022-12-24  发布在  React
关注(0)|答案(2)|浏览(113)

我有一个组件,它返回一个包含几个屏幕的<Stack.Navigator>。我还有一个定制的headerLeft元素,它在单击时执行一个函数。现在,如果我在enterEmail屏幕上,我试图隐藏headerLeft,但让它在所有其他屏幕上可见。
在实现我自己的后退按钮之前,我只是使用这个命令来隐藏enterEmail屏幕上的后退按钮:

<Stack.Screen
            name="EnterEmail"
            options={{ title: LOGIN_TITLE, headerBackVisible: false }}
            component={EnterEmail}
        />

但是现在我使用的是自定义元素,这就不起作用了。

const AuthStack: FunctionComponent = () => {
    const navigation = useNavigation<LandingScreenNavigationProp>();

    const headerTitle = <HeaderText variant="h5">Log in</HeaderText>;

    return (
        <Stack.Navigator
            initialRouteName="Landing"
            screenOptions={{
                animation: authStackAnimation,
                headerTitleAlign: 'center',
                headerBackVisible: false,
                headerLeft: () => <NavigationBackButton onPress={() => navigation.goBack()} />,
                headerRight: () => <NavigationCloseButton onPress={() => navigation.navigate('Landing')} />,
            }}
        >
            <Stack.Screen options={{ headerShown: false }} name="Landing" component={Landing} />
            <Stack.Screen name="EnterEmail" options={{ headerTitle: () => headerTitle }} component={EnterEmail} />
            <Stack.Screen name="EnterPassword" options={{ headerTitle: () => headerTitle }} component={EnterPassword} />
            <Stack.Screen name="EnterOTP" options={{ headerTitle: () => headerTitle }} component={EnterOTP} />
            <Stack.Screen
                name="CheckYourEmail"
                options={{ headerTitle: () => headerTitle }}
                component={CheckYourEmail}
            />
        </Stack.Navigator>
    );
};
webghufk

webghufk1#

您需要覆盖堆栈屏幕中的组/导航器选项。

<Stack.Screen
  name="EnterEmail"
  options={{ 
    headerTitle: () => headerTitle,
    headerLeft: {} // hide the header
  }}
  component={EnterEmail}
/>

我已经创建了一个snack与标志和背景在导航器的水平,但堆栈屏幕覆盖它。

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator screenOptions={{
        headerStyle: { backgroundColor: 'papayawhip' },
        headerTitle: (props) => <LogoTitle {...props} />
        }}>
        <Stack.Screen
          name="Dashboard"
          component={Dashboard}
          options={{
          headerTitle: {}, // override
          headerStyle: { backgroundColor: 'red' } }} // override
        />
        <Stack.Screen
          name="Home"
          component={HomeScreen}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}
t2a7ltrp

t2a7ltrp2#

您可以使用useLayoutEffect删除EnterEmail屏幕中的headerLeft按钮,如下所示。

const EnterEmail = ({navigation}) => {
  useLayoutEffect(() => {
    navigation.setOptions({
      headerLeft: () => null,
    })
  }, [navigation])
}

相关问题