React-Router嵌套路由加载空白页面而不是在父组件内部加载

时间:2018-09-29 10:44:24

标签: reactjs react-router

我是React的新手,正在尝试创建带有嵌套路线的布局。这是我的情况

  • 在URL为/
  • 时显示登录名
  • URL为/ dashboard时显示仪表板
  • 在URL为/ dashboard / profile时显示配置文件(应加载 在仪表板内容区域内)

在浏览器中访问URL时,登录页面和仪表板页面已正确加载,但对于/ dashboard / profile,浏览器将转到空白页面,而不是将其加载到仪表板组件内部。

Index.js

ReactDOM.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>, 
    document.getElementById('root'));

App.js

class App extends Component {
  render() {
    return (
      <div>
        {/* <Switch> */}
          <Route exact path='/' component={SignIn}/>
          <Route exact path='/dashboard' component={Dashboard}/>
        {/* </Switch> */}
      </div>
    );
  }
}

export default App;

Dashboard.js

class Dashboard extends React.Component {

  render() {
    const { classes } = this.props;

return (
  <React.Fragment>
    <CssBaseline />
    <div className={classes.root}>
      <Header classes={classes} open={this.state.open} click={this.handleDrawerOpen} />
      <Sidebar classes={classes} open={this.state.open} click={this.handleDrawerClose} />
      <main className={classes.content}>
        <div className={classes.appBarSpacer} />           

        *********I expect profile component to load here 
but when I access the URL /dashboard/profile I get a new blank page*********

        Route path="/dashboard/profile" exact component={Profile} />



      </main>
    </div>
  </React.Fragment>
);
  }
}

1 个答案:

答案 0 :(得分:2)

在进行子级路由时,您需要从仪表板路由(在exact中显示)中删除Switch道具。

这是用例的最小实现:

import React, { Component } from "react";
import "./styles.css";

import {
  NavLink,
  Redirect,
  Route,
  BrowserRouter as Router,
  Switch
} from "react-router-dom";

const App = () => (
  <Router>
    <div className="App">
      <ul>
        <li>
          <NavLink to="/login">Login</NavLink>
        </li>
        <li>
          <NavLink to="/dashboard">Dashboard</NavLink>
        </li>
      </ul>

      <Switch>
        <Route exact path="/login" component={Login} />
        <Route path="/dashboard" component={Dashboard} />
      </Switch>
    </div>
  </Router>
);

const Login = () => <span>Login Page</span>;

const Dashboard = () => {
  return (
    <div>
      <div>Dashboard Page</div>
      <NavLink to="/dashboard/profile">Go to profile</NavLink>
      <div>
        <Route exact path="/dashboard/profile" component={Profile} />
      </div>
    </div>
  );
};

const Profile = () => {
  return <span>Profile Page</span>;
};

export default App;  

您可以在此处找到工作示例:https://codesandbox.io/s/z3py3672v3