为什么路由对象有时具有状态,有时却没有-在react-navigation v5中

问题描述 投票:0回答:1

开始:

<NavigationContainer>
      <Stack.Navigator>
        {
          isLoading ? <Stack.Screen name="AuthLoadingScreen" component={AuthLoadingScreen} />
          : (
          user ? (
            <Stack.Screen  name="AuthenticatedStack" component={AuthenticatedStack} options={{headerShown: false}} />
            ) : (
              <Stack.Screen  name="NotAuthenticatedStack" component={NotAuthenticatedStack} options={{headerShown: false}} />
            )
          )
        }
      </Stack.Navigator>
    </NavigationContainer>

经过认证的堆栈:

const AuthenticatedStack = () => {
  return (
    <Drawer.Navigator initialRouteName="MainStack" drawerContent={props => <SideBar {...props} />}>
        <Stack.Screen name="MainStack" component={MainStack} options={({route}) => ({
            headerShown: shouldHeaderBeShown(route),title: getHeaderTitle(route),
          })} />
      </Drawer.Navigator>
  );
};

主堆栈包含带有选项卡导航器的主屏幕以及我计划从侧面菜单按钮导航至的其他导航器:

const MainStack = () => {
  return (
    <Stack.Navigator>
          <Stack.Screen name="main" component={MainTabNavigator} options={({route}) => ({
            headerShown: shouldHeaderBeShown(route),title: getHeaderTitle(route),
          })} />
          <Stack.Screen options={({route}) => ({
            title: getHeaderTitle(route),
          })} name="Welcome" component={WelcomeStack} />
        </Stack.Navigator>
  );
};

[主选项卡导航器只是几个选项卡:

const MainTabNavigator = () => {
  return (
    <Tab.Navigator>
      <Tab.Screen
...

家庭堆栈导航器:

const HomeStackNavigator = ({navigation, routes}) => {
  return (
    <Stack.Navigator>
      <Stack.Screen name="Home" component={HomeScreen} options={{
          headerLeft: () => (),
        }} />
      <Stack.Screen name="Details" component={DetailsScreen} />
    </Stack.Navigator>
  );
};
Welcome stack:
const WelcomeStack = () => {
  return (
    <Stack.Navigator>
      <Stack.Screen options={({route}) => ({
        headerShown: shouldHeaderBeShown(route),title: getHeaderTitle(route),
      })} name="welcome" component={WelcomeScreen} />
    </Stack.Navigator>
  );
};

我使用这两个功能来显示隐藏标题,以避免标签上的双重标题并设置标题:

function shouldHeaderBeShown(route) {
  const routeName = route.state ? route.state.routes[route.state.index].name : 'Home';

  switch (routeName) {
    case 'Home': return false;
  }
}

function getHeaderTitle(route) {
  const routeName = route.state ? route.state.routes[route.state.index].name : 'Home';

  switch (routeName) {
    case 'Home': return 'Home';
    case 'Settings': return 'Settings';
    case 'Welcome': return 'Welcome';
  }
}

这里我想到了这个问题:这行代码:route.state ? route.state.routes[route.state.index].name如果在选项卡之间切换,我会正确地获得所有state属性,并且可以设置好标题。但是,如果我从抽屉中导航到Welcome,则route没有state属性,因此它始终选择“主页”作为标题。我将这一行传递给:

const routeName = route.state ? route.state.routes[route.state.index].name : route.name;

然后显示Welcome标题。但我不知道此解决方法是否可行,或者可以以更好的方式设置此屏幕?

reactjs react-native react-navigation react-navigation-stack react-navigation-drawer
1个回答
0
投票

但是如果我从抽屉导航到“欢迎”,则>

© www.soinside.com 2019 - 2024. All rights reserved.