reactjs - 通过 `:id` 反应嵌套路由
问题描述
我正在尝试创建一个带有“文章”页面的博客风格应用程序,该页面具有将呈现的帖子列表postId
。我已经得到了要生成的 url,甚至是<Post />
要渲染的小组件,但是当一个帖子页面呈现时,文章内容并没有消失,帖子内容只是呈现在它下面。我该如何解决?
我有
App.js
:
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route exact path="/articles">
<Articles />
</Route>
</Switch>
Articles.js
:
import React from 'react';
import {
Link,
useRouteMatch,
Switch,
Route,
} from 'react-router-dom';
import Post from '../Components/Post';
import Banner from './Banner';
const Articles = () => {
let match = useRouteMatch();
return (
<div className='Articles'>
<Banner title='Articles'/>
<h3>Please select a topic.</h3>
<ul>
<li>
<Link to={`${match.url}/geojsons`}>Geojsons</Link>
</li>
<li>
<Link to={`${match.url}/props-v-state`}>
Props v. State
</Link>
</li>
</ul>
<Switch>
<Route path={`${match.url}/:postId`}>
<Post />
</Route>
</Switch>
</div>
)
}
export default Articles;
Post.js
:
function Post() {
let { postId } = useParams();
return <h3>POST - Requested topic ID: {postId}</h3>;
}
export default Post;
此屏幕截图显示您单击文章链接后的页面。Post
内容是我在红色虚线框中的内容,它上面的所有内容都应该只是文章页面的一部分。
我知道这只是几个文件,但为了更容易弄乱我在github上放了一个简化版本的 repo 。没有样式或任何只是问题的 html 版本。
解决方案
由于您希望文章和帖子页面是分开的,因此您需要将您的帖子路由与文章路由分离,并将其呈现在 App.js 而不是 Articles.js 中
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/articles/:postId">
<Post />
</Route>
<Route exact path="/articles">
<Articles />
</Route>
</Switch>
在 Article.js 中
const Articles = () => {
let match = useRouteMatch();
return (
<div className='Articles'>
<Banner title='Articles'/>
<h3>Please select a topic.</h3>
<ul>
<li>
<Link to={`${match.url}/geojsons`}>Geojsons</Link>
</li>
<li>
<Link to={`${match.url}/props-v-state`}>
Props v. State
</Link>
</li>
</ul>
</div>
)
}
推荐阅读
- java - 如何在android应用程序中显示缺货项目
- azure-webjobs - 如何在 IEventProcessor.ProcessEvents 方法中处理失败消息
- powershell - 从两个对象构造自定义对象
- spring-boot - 服务器发送事件 - 几次断开连接后流未重新连接
- javascript - 如何正确定义函数的数组参数?
- python - 不理解地计算总和
- javascript - 如何使用数组包含函数检查对象数组中的对象相等性?
- apache-spark - 所需的执行程序内存高于此集群的最大阈值
- reactjs - 如何使用 webpack ManifestPlugin 为具有 2 个入口点的反应项目创建 2 个不同的 manifest.json 文件?
- dictionary - 为什么我不能在这里创建一个简单的字典