2017-04-08 14 views
1

React Router V4でネストされたルートを使用している場合、NoMatchコンポーネントにリダイレクトするにはどうすればよいですか?React Router v4 globalネストされたルートの子に一致しない

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import injectTapEventPlugin from 'react-tap-event-plugin'; 
injectTapEventPlugin(); 

import { 
    BrowserRouter as Router, 
    Route, 
    Switch 
} 
from 'react-router-dom'; 
import Website from './website/Website'; 

const Register = ({ match}) => { 
    return (
     <div> 
      <Route exact path={match.url} render={() => {return <h1>Register</h1>} } /> 
      <Route path={`${match.url}/detail`} render={()=>{return <h1>Register Detail</h1>}} /> 
     </div> 
    ) 
} 

const App =() => (
    <Router> 
     <Switch> 
       <Route exact path="/" render={() => {return <h1>Home</h1> }} /> 
       <Route path="/register" component={Register} /> 
       <Route component={() => {return <h1>Not found!</h1>}} /> 
     </Switch> 
    </Router> 
); 

ReactDOM.render(
    <App/>, document.getElementById('root')); 

あなたが見ることができるように、そこに登録以下NOMATCHルートがあるが、私は私の子コンポーネントの登録に同じルートマップを使用したくない:

は、ここに私のコードです。このようにして、私が/ register/unregisteredmatchに行くと、NoMatch Routeに入力しないので、ページは単に空白になります。

私の子供のルートで指定しないで、グローバルNoMatchをマップするにはどうすればよいですか?子コンポーネントにこの責任を渡すことは望ましくありません。

ありがとうございました。

+0

HoCを作成する必要があります。登録された子ルートが一致するかどうかは関係なく常に登録されます。そのためのハンドラを作成する必要があります –

+0

@ReiDien私が理解していれば、NoMatchハンドラをカプセル化する「抽象」コンポーネントを作成する必要があります...そうですか?ありがとうございます – yurikilian

答えて

-1

あなたができることは、ルートアプリケーションで可能なすべてのルートを定義することです。私は

/に行っていない場合は、次はいつも私の NOMATCHコンポーネントをレンダリングしますので、
const App =() => (
    <Router> 
     <Switch> 
       <Route exact path="/" render={() => {return <h1>Home</h1> }} /> 
       <Route path="/register/(detail)?" exact component={Register} /> 
       <Route component={() => {return <h1>Not found!</h1>}} /> 
     </Switch> 
    </Router> 
); 
+1

ありがとう@ジャバグル!私はメインファイルに指定せずにコンポーネントをデカップリングしようとしています。動的なインポートの目的だけで、メインファイルにルートをマップしたくないからです。私は、インポートに応じてルートファイルを作成できることを知っていますが、モジュールでそれを行う方法を探しています。 – yurikilian

0

は私が スイッチと同じ問題を抱えている。そのため、次のようにオプションのパターンを使用して、アプリケーションのコンポーネントを適応させますあなたはこのように、ネストされた スイッチの内側にあなたの NOMATCHを移動した場合
<Router history={history}> 
    <Switch> 
    <Route path='/a' component={A} /> 
    <Switch> 
     <Route path='/b' component={B} /> 
     <Route path='/b/:id' component={C} /> 
    </Switch> 
    <Route path="*" component={NoMatch}/> 
    </Switch> 
</Router> 

しかし、それは、予想通り、動作します。

これが第二 スイッチがも同様である第一 ルートのような別のファイルにあるので、それはあなたが望むものではない問題の「解決策」であっても
<Router history={history}> 
    <Switch> 
    <Route path='/a' component={A} /> 
    <Switch> 
     <Route path='/b' component={B} /> 
     <Route path='/b/:id' component={C} /> 
     <Route path="*" component={NoMatch}/> 
    </Switch> 
    </Switch> 
</Router> 

アプリケーションが大きくなり、別のファイルでより多くのルートが再生されるようになると、NoMatchのルートを予想どおりに動作させる必要があるかわかりません。

他の解決方法がありますか?

+0

こんにちは!私は、このToisへの最良のアプローチは、上記のコメントで@ReiDienが説明したように、高次コンポーネントを使用して一致しないものを処理すると考えています。私はまだ試していない。 – yurikilian

+0

入れ子になったスイッチはサポートされていません。したがって、異なるファイルでルートを設定している場合は、それらのスイッチからスイッチを返さないでください。私がしたのは、/ bと/ b /:idルートを持つ一連のルートを返すことでした。 – bjorgvin

関連する問題