Reactjs React router 5:恢复浏览器背面的滚动位置

Reactjs React router 5:恢复浏览器背面的滚动位置,reactjs,react-router,Reactjs,React Router,这方面也有类似的问题,但react路由器的版本不同,我没有找到适合我的答案 在用户点击路由器链接并点击浏览器后退按钮后,我试图恢复长页面中的滚动位置。我本以为他们会处理这件事,但显然他们已经决定了 我尝试了几个软件包,如和,但没有效果:当使用back时,无论我使用Firefox还是Chromium,位置总是在文档顶部。 页面不会立即加载,但不到一秒钟 是否有任何解决方案可用于react router dom 5 BrowserRouter 以下是总体结构: <BrowserRouter&g

这方面也有类似的问题,但react路由器的版本不同,我没有找到适合我的答案

在用户点击路由器链接并点击浏览器后退按钮后,我试图恢复长页面中的滚动位置。我本以为他们会处理这件事,但显然他们已经决定了

我尝试了几个软件包,如和,但没有效果:当使用back时,无论我使用Firefox还是Chromium,位置总是在文档顶部。 页面不会立即加载,但不到一秒钟

是否有任何解决方案可用于react router dom 5 BrowserRouter

以下是总体结构:

<BrowserRouter>
  <main>
    <h1>...</h1>
    <Switch>
      <Route exact path='...'
      ...
    </Switch>
  </main>
</BrowserRouter>

...

到目前为止,我为我的应用程序找到了两种解决此问题的方法,但它们可能不适用于所有项目:

  • 使用,它还通过选项
    wrapHistory(历史,{renderTimeout:500})修复了焦点以提高可访问性。缺点是您必须设置延迟,这可能不适合所有用户,取决于他们的连接速度
  • 沿历史路径缓存AJAX查询的结果。在我的例子中,我只需要缓存每个不同对象类型的最新结果。这符合用户的期望:滚动位置被恢复,页面内容不会自动更新。但它可能不适用于所有应用程序
一般来说,丹尼尔尼克松的解决方案可能更好,但我不确定如何实施:

另一个选项是在ajax响应可用时立即执行history.replace()。然后,在用户返回后,使用路由状态呈现页面,而不是再次发出ajax请求


Hi@Damien参考路由器文档有一种方法可以使用HOC在顶部滚动我知道,我不想滚动到顶部,因为它已经这样做了。我希望恢复用户单击链接时的滚动位置(链接通常会发生这种情况-这是用户期望的行为)。我认为您需要一些东西,比如我们可以为所有按钮编写自定义的单击方法,链接将当前位置作为参数存储在localstorage中,redux就像一个历史记录,然后从那里我们可以获取旧位置并使用样式扫描进行设置。您确定为什么react scroll manager不适合您吗?这让我很惊讶。我写了一个类似的东西,但我怀疑它对您不起作用,原因与react scroll manager不起作用的原因相同(不管是什么):另一个选择是在ajax响应可用时立即执行
历史记录。replace()
。然后,在用户返回后,使用路由状态呈现页面,而不是再次发出ajax请求。