2017-01-26 5 views
2

子ルートにリダイレクトしたい場合は、設定値を確認しています。いつものように表示するだけではありません。コードは期待どおりにURLを更新しますが、無限ループに入ります。React Router onEnter関数 "Uncaught RangeError:最大呼び出しスタックサイズを超過しました"

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')) 

enter image description here

答えて

0

あなたがルート/mapscheckDefaultFloor()を入力するたびに/map's子の1つにリダイレクトされ実行されるためには、無限ループに入ります。

リダイレクトにより、onEnter -> checkDefaultFloor()が再度トリガーされ、無限の再帰がトリガーされます。既にリダイレクトされていない場合、あなたがする必要がどのような

は、例えば、<Maps />componentDidMountに機能を移動したり、チェックのいずれかであるあなたがbrowserHistory.push()文は、それがため、無限ループに行くことになっている

hasRedirected = false; 

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

は>> componentDidMountに機能を移動する - は私 – jriggs

+0

のために働いていたと他の回答を見てください私はそれがうまくいくのが好きです。 – lustoykov

+0

試してみましたが、同じエラーを投げていました – jriggs

0

ルートはあなたのmapルートにネストされています。 replaceの機能とcallbackのような機能を使用する必要があります。

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

私はこの答えが良いかもしれないと思います、交換がonEnterを再びトリガーしないのでしょうか? – lustoykov

+0

置換はまさに目的のために使用されています –

1

私は同様の問題がありました。解決策は、Shubham Khatriが提案したものを実装することでした。しかし、私が最初に逃した重要なポイントは、onEnterコールバックをIndexRouteにアタッチすることでした。私は標準のJavaScriptオブジェクトを使用してルートを定義しています。これは私がする必要があるものです:

{ 
    path: '/', 
    indexRoute: { 
    onEnter: (nextState, replace) => replace('some-route') 
    }, 
    childRoutes: [...] 
} 

OPのJSXコードで同様の問題があったと思います。 (私はこれをテストしていませんが)それはおそらく、このようにされている必要があります。

function checkDefaultFloor(nextState, replace, callback){ 
    if (settings.floorUrl){ 
    console.log(settings.floorUrl); 
    replace(`/maps/${settings.floorUrl}`) 
    } 
    callback(); 
} 
<Router history={browserHistory}> 
    <Route path="/" component={App}> 
     <IndexRoute component={Home}/> 
     <Route path="/maps" component={Maps}> 
     <IndexRoute onEnter={checkDefaultFloor}/> 
     <Route path="/maps/:mapName" component={Map}/> 
     </Route> 
     <Route path="/about" component={About}/> 
    </Route> 
    </Router> 
関連する問題