通过 React Router 中的 <Link> 重新加载组件

IT技术 reactjs react-router react-router-v4
2021-05-10 14:25:07

我正在尝试实现一个类似 facebook 的主页(即带有评论的帖子列表)。

PostList是负责加载帖子列表的组件(在其 中使用 fetch componentDidMount()),它本身是组件的子组件HomePage

我有另一个导航栏组件,NavBar用一个<Link>组件(从react-router-dom)到我的HomePage组件的路由('/')调用

当我在“/”以外的任何页面上时,使用链接工作正常:路由器安装HomePage,然后PostList触发componentDidMount()并显示新检索的帖子。

但是当我已经在“/”上时,链接什么也不做,因为我已经在“/”上,但我希望它仍然重新加载我的组件,HomePage以便它可以更新其帖子列表。

我该怎么做 ?

2个回答

React 组件仅在给定不同props(或state更改时)时才重新渲染
我遇到了与您类似的问题,我timestamp每次都通过向组件传递一个props来解决它那为我解决了这个问题。所以在你的<Router>组件内部,你定义Home组件的路由,使用以下代码:

<Route path='/' component={ (props) => (
  <Home timestamp={new Date().toString()} {...props} />
)}/>

这样,timestampprop 在后续单击时会发生变化,并且每次单击<Link>.

我今天正在解决一个类似的问题。我有路线:

<Route exact path="/:id" render={({ match }) => (<MyComponent match={match} />)} />

如果newId与渲染相同,则不会调用重新加载的链接id

<Link to={{ pathname: `/${newId} }} >Go</Link>

我找到的最简单的解决方案是添加新的重新加载重定向(在路由下):

<Redirect from="/:id/reload" to="/:id" />

并更改链接newId === id

<Link to={{ pathname: `/${id}/reload` }} >Reload</Link>

我还找到了一个添加带有时间戳的新路由的解决方案(如1567430708808):

<Route exact path="/:id/:ts" render={({ match }) => (<MyComponent match={match} />)} />

并从match钩子的对象中读取它,但时间戳出现在 URL 中,它不如重定向那么好。我需要提到我使用 react-router 5.0.1。