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
我正在开发一个简单的 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