2017-08-03 27 views
0

我想爲我的應用版本1的所有路由前面的React Router v4中的某些路徑創建前綴,例如v1。以下是我已經試過:在React Router v4中爲路由添加前綴

<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

我們可以看到'App'嗎? – Li357

+0

確定再次檢查:) –

+0

嘗試刪除第二個'並查看哪些hapeens。最有可能的是在那裏匹配。 – learner

回答

2

而不是使用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將呈現兩種可能的路徑一Switchmatch.url這裏是v1,因爲它匹配的URL部分v1。然後,它創建一個${match.url}/login的路線,導致v1/login。現在,當您導航到v1/login時,您將獲得Login組件。

+0

好的,但有沒有什麼辦法可以在路由文件而不是組件文件中做到這一點,所以我的路由邏輯更多地在路由文件夾中組織? –

+0

@LakshayJain我不這麼認爲,除非你明確地列出每條可能的路線。在以前的React路由器版本中,您可以使用嵌套路由來完成您想要的任務,但在v4中,除非以這種方式進行,否則不可能。 – Li357

+0

所以我應該爲每個前綴創建佈局文件並將其用作路由文件,就像您的答案一樣? –

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;