React Router v4、たとえば、アプリのバージョン1のすべてのルートの前にあるv1
のいくつかのパスのプレフィックスを作成したいのですが、これが私が試したことです。
<BrowserRouter>
<Switch>
<App path="v1" >
<Switch>
<Route path="login" component={Login} />
<Route component={NotFound} />
</Switch>
</App>
<Route component={NotFound}/>
</Switch>
</BrowserRouter>
これがApp
です:
import React, { Component } from 'react';
import logo from '../Assets/logo.svg';
import '../Assets/css/App.css';
class App extends Component {
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
export default App;
現在、このアプローチを使用していますが、機能していないようです。 http:\\localhost:3000\v1\login
に移動すると、NotFound
コンポーネントが表示されます。ここで何か助けはありますか?
コンテナとしてApp
を使用する代わりに、次のようにルートを再構築します。
<BrowserRouter>
<Switch>
<Route path="/v1" component={App} />
<Route component={NotFound}/>
</Switch>
</BrowserRouter>
これにより、/v1
または/v1/whatever
に移動するたびにApp
がレンダリングされます。次に、App
で、子をレンダリングする代わりに、他のルートをレンダリングします。
render() {
const { match } = this.props;
return (
<Switch>
<Route path={`${match.url}/login`} component={Login} />
<Route component={NotFound} />
</Switch>
);
}
したがって、App
は2つの可能なルートでSwitch
をレンダリングします。 match.url
は、URL部分v1
と一致したため、v1
です。次に、${match.url}/login
でルートを作成し、結果はv1/login
になります。これで、v1/login
に移動すると、Login
コンポーネントが表示されます。
同様の問題に遭遇しました。 <BrowserRouter basename='/v2'>
https://reacttraining.com/react-router/web/api/BrowserRouter/basename-string を使用することになりました
ルーターファイルでプレフィックスを使用したい場合
import {BrowserRouter , Route , Switch } from 'react-router-dom';
import App from '../Components/v1/App';
import React from 'react';
import NotFound from '../Components/404';
import Login from '../Components/v1/Login'
var v1="/v1";
const IndexRoute = (
<BrowserRouter>
<Switch>
<App path={v1}>
<Switch>
<Route path={`${v1}/login`} component={Login} />
<Route component={NotFound} />
</Switch>
</App>
<Route component={NotFound} />
</Switch>
</BrowserRouter>
);
export default IndexRoute;