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

react-navigation使用router时出现Cannot read property 'routes' of undefined报错求助

解决react-navigation中“Cannot read property 'routes' of undefined”报错问题

嘿,咱们来看看你遇到的这个报错到底是咋回事!瞅完你的代码,我一眼就找到问题根源了——你在自定义getStateForAction逻辑时,完全没考虑到应用初始化阶段state是undefined的情况!

问题拆解

当你的App第一次启动时,react-navigation还没生成初始的路由状态,这时候传入getStateForAction的state参数就是undefined。你代码里直接去访问state.routes,可不就触发“Cannot read property 'routes' of undefined”的错误嘛!

另外还要提一句:你写的if (true)是永远成立的条件,这会导致每次触发任何导航action都会强行添加Login路由,这肯定不是你想要的效果,建议改成针对特定action类型的判断。

修复后的代码示例

const SimpleApp = TabNavigator({})
const Simple = StackNavigator({
  Home: { screen: SimpleApp },
  Login: { screen: Login },
})
const defaultGetStateForAction = Simple.router.getStateForAction;
Simple.router.getStateForAction = (action, state) => {
  console.log('action ===',action);
  console.log('state ===',state);
  console.log('......getStateForAction........');
  
  // 关键:先判断state是否存在,不存在就用默认逻辑生成初始状态
  if (!state) {
    return defaultGetStateForAction(action, state);
  }

  // 替换成你实际需要触发跳转的条件,比如判断自定义action类型
  if (action.type === 'TRIGGER_LOGIN') {
    const routes = [
      ...state.routes,
      {key: 'A', routeName: 'Login', params: { name: action.name1 }},
    ];
    return {
      ...state,
      routes,
      index: routes.length - 1,
    };
  }
  return defaultGetStateForAction(action, state);
};

export default class App extends Component {
  render() {
    return (
      <Simple />
    )
  }
}

额外提醒

  • 自定义路由逻辑时,一定要处理state为undefined的边界情况,这是react-navigation开发里很容易踩的坑
  • 尽量针对特定的action类型做拦截处理,别全局拦截所有导航动作,否则会破坏react-navigation的默认导航行为

内容的提问来源于stack exchange,提问作者张东生

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:42:18