我想为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
组件。
这里有什么帮助吗?
答案 0 :(得分:10)
遇到了类似的问题。使用<BrowserRouter basename='/v2'>
结束
https://reacttraining.com/react-router/web/api/BrowserRouter/basename-string
答案 1 :(得分:4)
而不是使用App
作为容器,重新构建您的路线,如下所示:
<BrowserRouter>
<Switch>
<Route path="/v1" component={App} />
<Route component={NotFound}/>
</Switch>
</BrowserRouter>
每当您导航到App
或/v1
时,这会使/v1/whatever
呈现。然后,在App
中,不再渲染子项,而是渲染其他路径:
render() {
const { match } = this.props;
return (
<Switch>
<Route path={`${match.url}/login`} component={Login} />
<Route component={NotFound} />
</Switch>
);
}
因此,App
将使用两条可能的路线呈现Switch
。 match.url
此处为v1
,因为它与网址部分v1
匹配。然后,它会创建一个${match.url}/login
的路线,其结果为v1/login
。现在,当您导航到v1/login
时,您将获得Login
组件。
答案 2 :(得分:0)
如果有人想在路由器文件中使用前缀
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;