Javascript React路由器onEnter功能“;未捕获范围错误:超过最大调用堆栈大小;
我正在检查要设置的配置值,如果是,我希望重定向到子路由。如果不只是照常显示。代码确实会按预期更新URL,但随后会进入无限循环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
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吗?替换就是为了这个目的而使用的