You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native使用@react-navigation/native的useRoute钩子出现Component Exception异常

报错原因

这个报错的本质是useRoute()只能在React Navigation导航器内部的路由树组件中调用,你的NavBar组件当前没有被导航器定义的Screen组件及其后代包裹,无法获取到导航上下文,所以触发了报错。

解决方案

方案1:将NavBar放到各个页面组件内部引用

在你的Home、Catalog、Adm等Screen页面组件的渲染逻辑中,引入并使用NavBar组件,此时NavBar作为Screen的子组件,天然可以访问导航上下文,useRoute()就可以正常调用。

方案2:通过导航器的header配置全局挂载NavBar

如果你希望所有页面统一复用NavBar,不需要每个页面单独引用,可以直接在导航器的screenOptions中配置自定义header为你的NavBar组件,导航器会自动给header组件注入导航上下文:

import { createNativeStackNavigator } from '@react-navigation/native-stack';
import NavBar from './NavBar';
import Home from './Home';
import Catalog from './Catalog';
import Adm from './Adm';

const Stack = createNativeStackNavigator();

const AppStack = () => {
  return (
    <Stack.Navigator
      screenOptions={{
        header: () => <NavBar />
      }}
    >
      <Stack.Screen name="Home" component={Home} />
      <Stack.Screen name="Catalog" component={Catalog} />
      <Stack.Screen name="Adm" component={Adm} />
    </Stack.Navigator>
  )
}

方案3:使用布局组件包裹页面内容

如果你不想使用导航器自带的header插槽,可以封装一个公共布局组件,将NavBar和页面内容插槽组合,在每个页面组件中用该布局包裹内容即可:

// 公共布局组件 Layout.js
import NavBar from './NavBar';

const Layout = ({ children }) => {
  return (
    <>
      <NavBar />
      {children}
    </>
  )
}

// 页面组件中使用
const Home = () => {
  return (
    <Layout>
      {/* 页面内容 */}
    </Layout>
  )
}

临时兼容方案

如果确实有场景需要在导航上下文外使用NavBar,可以将代码中的route.name修改为route?.name,避免取值报错,但该方案下路由状态不会自动更新,不适合导航高亮的需求,仅作临时兼容使用。


内容的提问来源于stack exchange,提问作者Alexandre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:27:00