React-router-domに複数のネストされたルートが必要です
react-router-domのv4を使用しています
私は持っています
import { BrowserRouter as Router, Route } from 'react-router-dom';
そのようにレンダリングするためのコンポーネントが必要です
--- Login
--- Home
--- Page 1
--- Page 2
--- Page 3
--- About
--- etc
Homeコンポーネントには、Page1、Page2、およびPage3コンポーネントに共通のHeaderコンポーネントが含まれていますが、LoginおよびAboutにはありません。
私のjsコードは次のようになります
<Router>
<div>
<Route path='/login' component={Login} />
<Home>
<Route path='/page1' component={Page1} />
<Route path='/page2' component={Page2} />
<Route path='/page3' component={Page3} />
</Home>
<Route path='/about' component={About} />
</div>
</Router>
/ page1、/ page2、/ page3を要求すると、ログインコンポーネントは/ loginのみに表示されると予想されます。これらには、それぞれホームコンポーネントとそのページのコンテンツが含まれている必要があります。
代わりに表示されるのは、ログインコンポーネントがレンダリングされ、その下にPage1のコンポーネントがレンダリングされることです。
私は非常に些細な何かを見逃している、またはどこかで本当にばかげた間違いを犯していると確信しています。過去2日間、これにこだわっています。
Props this.props.match.path
から取得したURL /パスの一致を使用して、コンポーネントに設定されているパスを取得します。
以下のようにメインルートを定義します
<Router>
<div>
<Route exact path="/" component={DummyIndex} /> {/* Note-1 */}
<Route path="/login" component={Login} />
<Route path="/home" component={Home} />
<Route path="/about" component={About} />
<Route path="/etc" component={Etc} />
</div>
</Router>
次に、Home
コンポーネントで、ルートを定義します
class Home extends Component {
render() {
return <div>
<Route exact path={this.props.match.path} component={HomeDefault} />
<Route path={`${this.props.match.path}/one`} component={HomePageOne} />
<Route path={`${this.props.match.path}/two`} component={HomePageTwo} />
</div>
}
}
定義されたルートは以下のとおりです
/ home/one/aおよび/ homeのようなHomePageOne
でさらにルートをネストしたい場合/ one/b、同じアプローチを進めることができます。
注-1:さらにネストしたくない場合は、prop exact
でルートを設定するだけです。
編集(2017年5月15日)
最初はprops.match.url
を使用していましたが、今ではprops.match.path
に変更しました。
ルートのパスでprops.match.path
の代わりにprops.match.url
を使用できるため、トップレベルルートでパスパラメーターを使用する場合、props.match.params
を介して内部(ネスト)ルートで取得できます。
パスパラメータを使用しない場合は、props.match.url
で十分です
ルーターv4でスイッチコンポーネントを使用する
<Router>
<Switch>
<Route path='/login' component={Login} />
<Route path='/about' component={About} />
<Home>
<Route component={({ match }) =>
<div>
<Route path='/page1' component={Page1} />
<Route path='/page2' component={Page2} />
<Route path='/page3' component={Page3} />
</div>
}/>
</Home>
</Switch>
export default class Home extends Component {
render() {
return (
<div className="Home">
{ this.props.children }
</div>
)
}
}
このコードは、コンポーネントを使用する基本的な考え方を示していると思います。
今週も同じ問題が発生しました。すべてのドキュメント、例、ビデオは以前のバージョンのものであり、バージョン4のドキュメントは混乱を招くため、プロジェクトは混乱の時期を迎えています。
これが私が物事を成し遂げる方法です。この助けがあれば教えてください
import React, { Component } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Root from './Root';
import Home from './Home';
import About from './About';
import './App.css';
class App extends Component {
render() {
return (
<BrowserRouter>
<div>
<Root>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/home" component={Home} />
<Route path="/about" component={About} />
</Switch>
</Root>
</div>
</BrowserRouter>
);
}
}
export default App;
すべての子ルートを親コンポーネントに移動し、以下のようにルートを拡張します。<Route path={`${match.url}/keyword`} component={Topic}/>
も確認してください react router training
次のように使用します。
class App extends Component {
render() {
return (
<BrowserRouter>
<Link to='/create'> Create </Link>
<Link to='/ExpenseDashboard'> Expense Dashboard </Link>
<Switch>
<Route path='/ExpenseDashboard' component={ExpenseDashboard} />
<Route path='/create' component={AddExpensePage} />
<Route path='/Edit' component={EditPage} />
<Route path='/Help' component={HelpPage} />
<Route component={NoMatch} />
</Switch>
</BrowserRouter>
);
}
}
もっと見る@ GitHubのスイッチをオンにする