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

标签 reactjs react-native react-navigation react-navigation-stack react-navigation-drawer

开始:

<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 属性,因此它总是选择“Home”作为标题。
我通过将此行传递给:

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

然后显示欢迎标题。
但我不明白这个解决方法可以吗?或者这个屏幕可以以更好的方式设置吗?

最佳答案

But If I from drawer navigate to Welcome

如何从抽屉中导航?如果您通过传递 screen 参数进行导航,则可以执行以下操作:

function getActiveRouteName(route) {
  // Access the tab navigator's state using `route.state`
  const routeName = route.state
    ? // Get the currently active route name in the tab navigator
      route.state.routes[route.state.index].name
    : // If state doesn't exist, we need to default to `screen` param if available, or the initial screen
      // In our case, it's "Home" as that's the first screen inside the navigator
      route.params?.screen || 'Home';

  return routeName;
}

您甚至需要这个的原因似乎也是因为您有太多嵌套的导航器。也许首先尝试减少嵌套? https://reactnavigation.org/docs/en/nesting-navigators.html#best-practices-when-nesting

关于reactjs - 为什么路由对象有时有状态有时没有 - 在react-navigation v5中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60127921/

相关文章:

javascript - ESLint: 'Helmet' 未定义 react/jsx-no-undef

typescript - 绘制多条路径时react-native-canvas的性能优化

javascript - 如何使用 react 导航从 FlatList react native 获取详细数据,触发器是来自 native 基础的按钮 onPress() ?

javascript - 在一次迭代中仅启用一个提交按钮

javascript - 如何用 Jest 模拟/替换对象的 getter 函数?

reactjs - 如何在 React Native 中下载图像期间避免 "Excessive number of pending callbacks: 501"错误?

css - 如何在 React Navigation 6 的标题中输入全 Angular 文本?

javascript - requireNativeComponent : "RNSScreenStackHeaderConfig" was not found in the UIManager when running android app

javascript - react : Uncaught RangeError: Maximum call stack size exceeded

javascript - 等待状态改变以对 redux 使用react