使用 react-router v4 为单个路由渲染多个组件?
Multiple components getting rendered for single route with react-router v4?
所以,我试图理解为什么在这种情况下会同时呈现 2 条路线:
import React, { Component } from 'react';
import { Route, NavLink, Switch } from 'react-router-dom';
import './Blog.css';
import Posts from './Posts/Posts';
import NewPost from './NewPost/NewPost';
import FullPost from './FullPost/FullPost'
class Blog extends Component {
render () {
return (
<div className="Blog">
<header>
<nav>
<ul>
<li><NavLink to="/" exact>Home</NavLink></li>
<li><NavLink to= "/new-post">New Post</NavLink></li>
</ul>
</nav>
</header>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</div>
);
}
}
export default Blog;
当我点击 New Post 而不是只看到 NewPost component 我也看到了另外 完整Post 组件。在这种情况下,我无法理解 /newpost 路径和 /:id 路径是如何相同的。我知道这个问题可以用 Switch 解决,但是我想知道为什么会这样。
这是因为,当您导航到 /new-post
时,两条路线路径正在匹配。当你写:path="/:id"
,id(一个可选的路由参数)可以是任何东西,数字,字符串等,所以 id 会变成 /new-post
,它也会渲染 FullPost
,这就是为什么.
解决方案是,使用react-router
中的Switch(它将始终渲染具有第一个匹配路径的组件)以避免匹配多个路径,这样只有一个组件会在路由上渲染路径匹配。像这样:
<Switch>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</Switch>
您需要将您的路由放在一个组件中。 switch 只会渲染第一个匹配的路由。
<Switch>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</Switch>
这个答案在
当您不使用 Switch 时,您会匹配两条路由,因为 /new-post 也被您的路由器视为一个 id 参数。
所以,我试图理解为什么在这种情况下会同时呈现 2 条路线:
import React, { Component } from 'react';
import { Route, NavLink, Switch } from 'react-router-dom';
import './Blog.css';
import Posts from './Posts/Posts';
import NewPost from './NewPost/NewPost';
import FullPost from './FullPost/FullPost'
class Blog extends Component {
render () {
return (
<div className="Blog">
<header>
<nav>
<ul>
<li><NavLink to="/" exact>Home</NavLink></li>
<li><NavLink to= "/new-post">New Post</NavLink></li>
</ul>
</nav>
</header>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</div>
);
}
}
export default Blog;
当我点击 New Post 而不是只看到 NewPost component 我也看到了另外 完整Post 组件。在这种情况下,我无法理解 /newpost 路径和 /:id 路径是如何相同的。我知道这个问题可以用 Switch 解决,但是我想知道为什么会这样。
这是因为,当您导航到 /new-post
时,两条路线路径正在匹配。当你写:path="/:id"
,id(一个可选的路由参数)可以是任何东西,数字,字符串等,所以 id 会变成 /new-post
,它也会渲染 FullPost
,这就是为什么.
解决方案是,使用react-router
中的Switch(它将始终渲染具有第一个匹配路径的组件)以避免匹配多个路径,这样只有一个组件会在路由上渲染路径匹配。像这样:
<Switch>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</Switch>
您需要将您的路由放在一个组件中。 switch 只会渲染第一个匹配的路由。
<Switch>
<Route path="/" exact component={Posts} />
<Route path="/new-post" exact component={NewPost} />
<Route path="/:id" exact component={FullPost} />
</Switch>
这个答案在
当您不使用 Switch 时,您会匹配两条路由,因为 /new-post 也被您的路由器视为一个 id 参数。