Javascript React路由器onEnter功能“;未捕获范围错误:超过最大调用堆栈大小;

Javascript React路由器onEnter功能“;未捕获范围错误:超过最大调用堆栈大小;,javascript,reactjs,react-router,Javascript,Reactjs,React Router,我正在检查要设置的配置值,如果是,我希望重定向到子路由。如果不只是照常显示。代码确实会按预期更新URL,但随后会进入无限循环 index.js import React from 'react' import { render } from 'react-dom' import { Router, Route, browserHistory, IndexRoute } from 'react-router' import App from './modules/App' import About

我正在检查要设置的配置值,如果是,我希望重定向到子路由。如果不只是照常显示。代码确实会按预期更新URL,但随后会进入无限循环

index.js

import React from 'react'
import { render } from 'react-dom'
import { Router, Route, browserHistory, IndexRoute } from 'react-router'
import App from './modules/App'
import About from './modules/About'
import Map from './modules/Map'
import Maps from './modules/Maps'
import Home from './modules/Home'
import { settings } from './appconfig.js';

function checkDefaultFloor(){
  if (settings.floorUrl){
    console.log( settings.floorUrl);
     browserHistory.push('/maps/'+ settings.floorUrl);
  }
}

render((
  <Router history={browserHistory}>
    <Route path="/" component={App}>
      <IndexRoute component={Home}/>
      <Route path="/maps" component={Maps}  onEnter={checkDefaultFloor}>
        <Route path="/maps/:mapName" component={Map}/>
      </Route>
      <Route path="/about" component={About}/>
    </Route>
  </Router>
), document.getElementById('app'))
从“React”导入React
从'react dom'导入{render}
从“react Router”导入{Router,Route,browserHistory,IndexRoute}
从“./modules/App”导入应用程序
从“./modules/About”导入关于
从“./modules/Map”导入映射
从“./modules/Maps”导入贴图
从“./modules/Home”导入主页
从“./appconfig.js”导入{settings};
函数checkDefaultFloor(){
如果(设置。地板){
console.log(settings.floorUrl);
browserHistory.push('/maps/'+settings.floorUrl);
}
}
渲染((
),document.getElementById('app'))

它进入一个无限循环,因为每次您进入路线
/maps
时,都会执行checkDefaultFloor()
,从而重定向到
/map的一个子项

重定向再次触发
oneter->checkDefaultFloor()
,从而产生无休止的递归

例如,您需要移动
组件didmount
中的功能,或者检查您是否尚未重定向

hasRedirected = false;

function checkDefaultFloor(){
  if (settings.floorUrl && !hasRedirected) {
    hasRedirected = true;
    browserHistory.push('/maps/'+ settings.floorUrl);
  }
}

您的
browserHistory.push()
语句使它处于一个无休止的循环中,因为路线嵌套在您的
map
路线中。您需要使用
replace
函数和
callback

function checkDefaultFloor(nextState, replace, callback){
  if (settings.floorUrl){
    console.log( settings.floorUrl);
     replace(`/maps/${settings.floorUrl}`)
  }
  callback();
}

我也有类似的问题。解决方案是实施Shubham Khatri的建议。然而,我最初错过的一个要点是将onEnter回调附加到IndexRoute。我使用标准JavaScript对象来定义我的路由。这就是我需要做的:

{
路径:“/”,
索引路径:{
onEnter:(nextState,replace)=>replace('some-route')
},
儿童路线:[……]
}
我敢打赌OP的JSX代码也有类似的问题。可能应该是这样的(尽管我还没有测试过):

功能检查DefaultFloor(下一状态、替换、回调){
如果(设置。地板){
console.log(settings.floorUrl);
替换(`/maps/${settings.floorUrl}`)
}
回调();
}


>移动componentDidMount中的功能--为我工作看看替换的另一个答案,如果它能工作我更喜欢它我认为这个答案可能更好,你确定替换不会再次触发OneNet吗?替换就是为了这个目的而使用的