react-navigation使用router时出现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,提问作者张东生
相关产品推荐
相关产品推荐

