【发布时间】:2017-12-11 17:20:31
【问题描述】:
在使用 react-router 时,我在返回按钮(历史弹出状态)上的滚动位置遇到了一些问题。 React 路由器 v4 不处理开箱即用的滚动管理,因为浏览器正在实现一些自动滚动行为。这很好,除非浏览器窗口的高度从一个视图到另一个视图变化太大。我已经实现了 ScrollToTop 组件,如下所述:https://reacttraining.com/react-router/web/guides/scroll-restoration
这很好用。当您单击链接并转到其他组件时,浏览器会滚动到顶部(就像普通的服务器渲染网站一样)。只有当您返回(通过浏览器后退按钮)到具有更高窗口高度的视图时,才会出现此问题。在 react 渲染内容(和浏览器高度)之前,似乎 (chrome) 试图转到上一页的滚动位置。这导致滚动只能根据它来自的视图的高度向下移动。想象一下这个场景:
View1:一长串电影(窗口高度 3500 像素)。
(点击电影)
View2:详细信息所选电影的视图(窗口高度:1000 像素)。
(单击浏览器后退按钮)
返回到视图 1,但滚动位置不能超过 1000px,因为 chrome 试图在 react 渲染长电影列表之前设置位置。
由于某种原因,这只是 Chrome 中的一个问题。 Firefox 和 Safari 似乎处理得很好。我想知道是否有其他人遇到过这个问题,以及你们通常如何在 React 中处理滚动恢复。
注意:所有电影都是从 sampleMovies.js 导入的——所以在我的示例中我不等待 API 响应。
【问题讨论】:
-
嘿,你解决问题了吗?我面临着完全相同的问题
-
4 年后仍然无法在 Chrome 中工作,但在 FF 和 Safari 中还可以。疯了……
标签: reactjs react-router