我想知道当前的路由名称,但是在导航js文件中,我在任何组件中都使用了useRoute钩子,并且工作得很好,但是当我在导航中使用useRoute时会出现这个错误.js

错误:找不到路由对象.您的组件是否位于导航器的屏幕内?

航行js代码示例,

export default function Navigation() {
  const route = useRoute(); // show error >> 错误:找不到路由对象.您的组件是否位于导航器的屏幕内?
  
  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}

当我删除useRoute时,错误就消失了,但我需要使用useRoute或任何其他方式在导航中获取当前路由名称.js文件.

推荐答案

您可以将navigationContainerRefNavigationContainer传递到Navigation组件,以使navigation对象可访问.

考虑下面的代码片段.

import { createNavigationContainerRef } from "@react-navigation/native"

export const navigationRef = createNavigationContainerRef()

const App = () => {
    return <NavigationContainer
              ref={navigationRef}>
                 <Navigation navigation={navigationRef} />
            </NavigationContainer>  
}
export default App

然后,在Navigation之内.

export default function Navigation({ navigation }) {

  const route = navigation.current?.getCurrentRoute()
  
  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}

然后使用route?.name访问当前路由名称.

Edit:正如jhon antoy在 comments 中正确指出的那样,如果我们导航到不同的屏幕,这不会更新当前路由状态.我们需要自己更新如下.

export const navigationRef = createNavigationContainerRef();

const App = () => {
  const [routeName, setRouteName] = useState();

  return (
    <NavigationContainer
      ref={navigationRef}
      onReady={() => {
        setRouteName(navigationRef.getCurrentRoute().name)
      }}
      onStateChange={async () => {
        const previousRouteName = routeName;
        const currentRouteName = navigationRef.getCurrentRoute().name;
        console.log("route", currentRouteName)
        setRouteName(currentRouteName);
      }}
    >
       <Navigation routeName={routeName} />
    </NavigationContainer>
  );
}

export default App;

Navigation以内.

export function Navigation(props) {

  const route = props.routeName

  console.log(props)

  return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}>
            <Stack.Screen name="HomeScreen" component={HomeScreen} />
      </Stack.Navigator>
  );
}

我得了snack with some simple navigation buttons分.

React-native相关问答推荐

嵌套的FlatList内的Incorrect Padding

TypeError:未定义不是对象(判断'theme.spacing [radius]')

React Navigation v5 中的初始路由参数?

如何在 React-Native 中创建检测自动位置的map

如何获取 React Native 应用程序的崩溃日志(log)?

在 iOS 模拟器中运行 React Native 应用程序时找不到 UMModuleRegistryAdapter.h

错误:看起来您在另一个中嵌套了一个NavigationContainer

由于依赖关系,在 run-android 上构建失败

react-native android中出现此问题Cannot convert argument of type class org.json.JSONArray的原因是什么?

iPhone 6s plus 上的字体大小

迷失在 Ionic、Cordova 等混合应用程序框架中

React-Native iOS - 如何通过按下按钮从 React-Native 视图导航到非 React-Native 视图(本机 iOS 视图控制器)?

如何使用 Stripe (stripe.js) 和 react-native

require() 必须有一个字符串文字参数 React Native

大型列表的 React-Native FlatList 性能问题

ScrollView bounce的 2 种不同背景 colored颜色

动画属性启动时 ReactNative ActivityIndi​​cator 不显示 false

如何在 React Native 中优化图像

动态改变 React Native Flat List 中的列数

React-native Awesome 元素没有构建 android 元素