react-router 在使用onEnter 时遇到了Maximum call stack size exceeded

如下代码,我在root上使用onEnter 来判断用户是否已登录然后进行相应的跳转,跳转到主界面,或者登陆界面。但是这个地方会导致Maximum call stack size exceeded。

<Router history={browserHistory}>
    <Route path='/' component={Main} onEnter={requireAuth}>
      <Route path='login' component={Login} />
    </Route>
</Router>

requireAuth(nextState,replace,callback){
    if(isLogined) {
         replace('/home');
    } else {
        replace('/login');
    }
    callback();
}

原因,主要是每次都会调用onEnter直到爆栈,解决方法可以通过在相应需要验证的route上添加onEnter进行验证。但这种需要每次添加感觉代码会不简洁,想知道有没有只在一个地方添加onEnter或者有什么更好的处理方法来避免重复添加onEnter的问题?

阅读 6.4k
2 个回答

我每次遇到Maximum call stack size exceeded都是因为死循环,多写几个console.log,看看哪里在死循环

login不应嵌套在根目录‘/’下面,写法有问题。这样每次判断后redirect到login,又会触发onEnter事件,导致死循环出现。
错误路由写法:

<Route path='/' component={Main} onEnter={requireAuth}>
  <Route path='login' component={Login} />
</Route

更正为:

<Route>
  <Route path='/' component={Main} onEnter={requireAuth}></Route>
  <Route path='/login' component={Login} />
</Route>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题