【问题标题】:Reload component via <Link> in React Router在 React Router 中通过 <Link> 重新加载组件
【发布时间】:2017-12-13 11:51:11
【问题描述】:

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

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

我有另一个导航栏组件,名为NavBar,带有一个&lt;Link&gt; 组件(来自react-router-dom)到我的HomePage 组件('/')的路由。

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

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

我该怎么做?

【问题讨论】:

    标签: reactjs react-router react-router-v4


    【解决方案1】:

    只有在给定不同的props(或state 更改)时,React 组件才会重新渲染。
    我遇到了与您类似的问题,我通过每次将 timestamp 道具传递给组件来解决它。这为我解决了这个问题。所以在你的&lt;Router&gt; 组件里面,你定义Home 组件的路由,使用下面的代码:

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

    这样,timestamp 属性会在后续点击时发生变化,并且每次点击 &lt;Link&gt; 时组件都会重新渲染。

    【讨论】:

    • 古德一号。一直在搜索它:)
    • 要使重新加载更灵敏(延迟更少),请使用
    【解决方案2】:

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

    <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。

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 2021-01-04
      • 2023-03-03
      • 2017-11-15
      • 1970-01-01
      • 2018-09-28
      • 2016-10-17
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多