React Component 在使用 React router 4 时不呈现

React Component not rendering on using react router 4

我正在开发一个简单的 React 演示项目。我有一个 Home 组件,当直接放在 main.js 中时会呈现,但当放在 Routes.js 中的 Router 中时,它不会呈现。谁能告诉我我做错了什么?

main.js 文件

import React from "react";
import {render} from "react-dom";
import {App} from "./app/App";
import Routes from "./app/Routes";

render( <Routes />,
    document.getElementById("root")
)

Routes.js 文件

import React from "react";

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

import {App} 
    from "./App";

import Home from "./components/Home";

export default function Routes(props) {

    console.log('Routes');
    return (
        <Router>
            <App>
                <Switch>
                    <Route path="/" exact  component={Home} />
                </Switch>  
            </App>
       </Router>
    )
}

App.js 文件

import React from "react";
import Header from "./components/Header";

export class App extends React.Component {

    render() {
        console.log("App render");

        return (
            <div>
                <h1> Welcome to React </h1>
                <Header/>
            </div>          
        )      
    }
}

Header.js 文件

import React, {Component} from 'react';
import {NavLink} from 'react-router-dom';

export default class Header extends Component {

    render() {
        console.log("Header render");

        return (
            <div>
                <NavLink to="/" exact>
                    Home
                </NavLink>                                   
            </div>
       )
    }
}

Home.js 文件

import React, {Component} from "react";

export default class Home extends Component {

    render() {
        console.log("Home render");

        return (
            <div> 
                <h2>Hello World!</h2>
            </div>
        )
    }
} 

这是因为你使用App组件作为整个应用的包装器,并且将Switch定义为App组件的子组件,所以你需要在App内部使用this.props.children

像这样:

export class App extends React.Component {
    render() {
        console.log("App render");
        return (
            <div>
                <h1> Welcome to React </h1>
                <Header/>
                {this.props.children}
            </div>          
        )  
    }
}

考虑这个例子使整个画面更清晰,如果你写:

<App>
   <Home />
</App>

意味着 Home 将作为子组件传递给 App 组件,它不会自动在 App 内呈现,您需要将 this.props.children 放在 App 内的某个位置。

使用您似乎正在使用的 react-router-v4,可以使用动态路由,这意味着您可以在嵌套组件中添加路由,因此除了@MayankShukla 建议的解决方案之外,您还可以将 <Switch> 和其他路线保持在 App 之内,如

export default function Routes(props) {

    console.log('Routes');
    return (
        <Router>
            <App/>
       </Router>
    )
}

export class App extends React.Component {

    render() {
        console.log("App render");

        return (
            <div>
                <h1> Welcome to React </h1>
                <Header/>
                <Switch>
                    <Route path="/" exact  component={Home} />
                </Switch>  
            </div>          
        )      
    }
}

您可以阅读更多关于 advantages of Dynamic Routing here