【问题标题】:React-Router v4 adding sub routesReact-Router v4 添加子路由
【发布时间】:2017-09-08 20:40:54
【问题描述】:

具有react-router v4 和 React 的大菜鸟。我正在尝试设置两个父路由://dashboard/ 将是登录/注册/等的登录页面,/dashboard 将是经过身份验证的区域。我在让子路由按照文档和这个 SO 回答 here

工作时遇到了一些麻烦

设置非常简单。这是我的app.js(路由//dashboard 工作正常):

import React from 'react'
import {Route, BrowserRouter, Switch} from 'react-router-dom'
import LandingPage from "./components/landing/LandingPage";
import ETFApp from "./components/dashboard/ETFApp";

class App extends React.Component {
    render() {
        return (
            <BrowserRouter>
                <Switch>
                    <Route path="/" exact component={LandingPage}/>
                    <Route path="/dashboard" component={ETFApp}/>
                </Switch>
            </BrowserRouter>
        )
    }
}

export default App;

但是我的LandingPage 组件的子路由似乎不起作用,尤其是/signup/login。我有预感我做错了什么。:

import React, {PropTypes} from 'react';
import {Link, Route} from 'react-router-dom';
import {ToolbarGroup, ToolbarTitle, RaisedButton, Toolbar} from 'material-ui'
import HomeCard from "./HomeCard";
import LoginPage from "../../containers/LoginPage";
import SignUpPage from "../../containers/SignUpPage";


const LandingPage = ({match}) => {
    return (
        <div>
            <Toolbar>
                <ToolbarGroup>
                    <Link to="/">
                        <ToolbarTitle text="ETFly"/>
                    </Link>
                </ToolbarGroup>
                <ToolbarGroup>
                    <RaisedButton label="Login" primary={true} containerElement={<Link to="/login">Log in</Link>}/>
                    <RaisedButton label="Sign up" primary={true} containerElement={<Link to="/signup">Sign up</Link>}/>
                </ToolbarGroup>
            </Toolbar>
            <Route path={match.url} exact component={HomeCard}/>
            <Route path={`${match.url}/login`} component={LoginPage}/>
            <Route path={`${match.url}/signup`} component={SignUpPage}/>
        </div>
    );
};

LandingPage.propTypes = {
    match: PropTypes.object.isRequired
}

export default LandingPage;

编辑:我删除了我的LandingPage 组件中的开关,因为它类似于文档here,但仍然没有好处。我也不再使用match 道具:

<Route path="/" component={HomeCard}/>
<Route path="/login" component={LoginPage}/>
<Route path="/signup" component={SignUpPage}/>

看起来组件没有在 React 开发工具中呈现:

任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: javascript reactjs react-router material-ui react-router-v4


    【解决方案1】:

    当你使用 exact 属性时,只有提供的路径会匹配。

    <Route exact path='/' component={LandingPage} />
    // only matches the pathname "/"
    

    您必须从路由中删除 exact 属性,以使其匹配 /login/signup 路径名。然而,仅仅这样做是行不通的,因为路由也会匹配/dashboard 路径名。解决此问题的最佳方法是在&lt;Switch&gt; 中切换两条路线的顺序

    <Switch>
      <Route path='/dashboard' component={ETFApp}/>
      <Route path='/' component={LandingPage}/>
    </Switch>
    

    【讨论】:

    • 哇。你是个天才。我想我没有意识到即使我在子组件中,父路由仍然处于活动状态。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2017-08-28
    • 2018-10-18
    相关资源
    最近更新 更多