【发布时间】:2022-10-19 14:06:18
【问题描述】:
如何设置 React Router 6 以在我导航和刷新浏览器窗口时恢复滚动位置?
React Router 5 有一个page about scroll restoration,但我在the docs for v6 中找不到任何关于滚动的信息,所以我想你应该用另一个包自己处理这个问题。很公平,但我找不到任何与 React Router 6 兼容的东西。
软件包 react-scroll-restoration 和 oaf-react-router 需要 v5。 (oaf-react-router 确实列出了它支持 v6,但 basic usage code example 与 v6 不兼容,the related issue #210 仍然开放。)
Gatsby 和 Next.js 支持开箱即用的滚动恢复,但我看起来没有一个可以直接使用的整齐打包的包。
这个小demo app with server side rendered pages 做我想做的事。当来回导航并刷新浏览器窗口时,滚动位置会恢复。
这里是the same app using React Router 6,滚动位置没有保存和恢复,但实际上在页面之间重用。通常的解决方法是在页面导航时滚动到顶部,但我对这种行为不感兴趣。
编辑:React Query writes that the issue with scroll restoration is that pages are refetching data,从而暗示如果用于渲染页面的数据在那里,滚动恢复就可以了。我无法确认这一点,因为我的小型 React Router 6 应用程序即使根本没有进行任何数据获取也存在问题。我觉得为了让它发挥作用,我觉得我缺少一些小东西。
咆哮:我很惊讶这个问题的典型答案是在导航时调用window.scrollTo(0, 0)。这仅解决了在页面之间传输滚动位置的问题。当滚动位置没有恢复时,页面之间导航时的用户体验会严重恶化。我想这就是弹出窗口如此受欢迎的部分原因,但它们带来了一长串其他用户体验问题,所以我真的想避免使用它们。
【问题讨论】:
-
RRDv5 文档解释说,RRD 做出的设计决定是不将此行为包含在 RRD 中,这取决于您。据我所知,您应该能够实现类似于
ScrollRestoration示例的东西。 -
RRDv6 似乎不包含 ScrollRestoration 和 RestoreScroll。
-
它也不包含在 RRDv5 中,这就是我评论的重点。您需要在
react-router-dom外部自己实现此行为。 -
是的。他们只是提供了如何实现这一点的一般指导方针。我想我希望有一个 npm 包来解决这个问题,这样我就可以专注于其他事情。感谢您指出了这一点。
标签: javascript reactjs react-router-dom