当前位置: 首页 > 面试题库 >

人们如何使用react-router v4处理滚动恢复?

孔宇
2023-03-14
问题内容

使用react-router时,后退按钮上的滚动位置(历史记录popstate)遇到一些问题。由于浏览器正在实现一些自动滚动行为,因此React
Router
v4无法开箱即用地管理滚动。这很棒,除非浏览器窗口的高度从一个视图到另一个视图变化太大。我已经实现了ScrollToTop组件,如下所述:https : //reacttraining.com/react-
router/web/guides/scroll-restoration

这很好。当您单击链接并转到其他组件时,浏览器将滚动到顶部(就像普通的服务器渲染网站一样)。仅当您返回(通过浏览器的后退按钮)到具有更高窗口高度的视图时,才会发生此问题。似乎(chrome)试图在react呈现内容(和浏览器高度)之前转到上一页的滚动位置。这将导致滚动仅根据其所在视图的高度尽可能远地向下移动。想象一下这种情况:

View1: 一长串电影(窗口高度3500px)。
(单击电影)
View2 :选定电影的详细信息视图(窗口高度:1000像素)。
(单击浏览器后退按钮)
返回视图1 ,但滚动位置不能超过1000像素,因为chrome试图在react渲染长电影列表之前设置位置。

由于某些原因,这只是Chrome中的问题。Firefox和Safari似乎处理得很好。我想知道是否有人遇到过这个问题,以及你们通常如何在React中处理滚动恢复。

注意:所有电影都是从sampleMovies.js导入的,因此在我的示例中,我不等待API响应。


问题答案:

您如何处理滚动恢复?

事实证明,浏览器具有history.scrollRestoration的实现。

也许您可以使用?检查这些链接。

https://developer.mozilla.org/zh-CN/docs/Web/API/History#Specifications


https://developers.google.com/web/updates/2015/09/history-api-scroll-
restoration

另外,我发现了一个npm模块,该模块可能能够轻松地进行react的滚动恢复,但是该库仅适用于react router v3及以下

https://www.npmjs.com/package/react-router-restore-scroll

https://github.com/ryanflorence/react-router-restore-
scroll

希望对您有所帮助。



 类似资料:
  • 在React中处理滚动位置的正确方法是什么?我真的很喜欢平滑滚动,因为更好的用户体验。因为在React中操作DOM是一个反模式,所以我遇到了一个问题:如何平滑地滚动到某个位置/元素?我通常会更改元素的scrollTop值,但这是对DOM的操作,这是不允许的。 杰斯宾 代码: 如何以反应的方式实现这一点?

  • 我的react中有一个滚动的事件处理程序,我正试图使它成为被动的。但它不起作用,我在控制台中不断收到以下警告: 将事件处理程序标记为“被动”以使页面更加响应。 下面是我阅读事件的地方: 这是我的EventContainer中的函数。js文件: 在这一行: {被动:被动} 我得到以下错误在我的编辑器: 参数类型{passive:boolean}不可分配给参数类型boolean 有人知道我做错了什么吗

  • 我有一个从Firebase数据库检索数据的简单片段。我使用firebase recycler视图显示检索数据。在滚动或屏幕旋转后,我无法强制回收器视图(或线性布局管理器)恢复滚动位置。 我在这里找到了一些答案,但它们不起作用。 我的代码是: 公共类NewsListFragment扩展了ParentNewsFragment{ } 最后的showToast方法显示了位置的真实数量,但recyclerv

  • 问题内容: 我正在寻找使用React实现无限滚动的方法。我遇到了react-infinite- scroll ,发现它效率低下,因为它只是将节点添加到DOM中,而不会删除它们。React是否有经过验证的解决方案,可以添加,删除和维护DOM中恒定数量的节点。 这是jsfiddle问题。在这个问题中,我想一次仅在DOM中包含50个元素。当用户上下滚动时,应加载和删除其他文件。由于它的优化算法,我们已经

  • 问题内容: 尝试进行某些路由需要身份验证。 我有这个: 注意:是的,身份验证服务可以正常工作。 对于每条路由,我都会检查用户是否已通过身份验证,如果没有通过身份验证,则要将他们重定向到登录页面,如果已通过身份验证,则它将以“ /”路由登陆到第一页。 我得到的是: 我在哪里做错了? 问题答案: 一个简单的解决方案是制作一个包含所有受保护路线的(高阶组件)。 根据您的应用程序的嵌套方式,您可能需要利用

  • 问题内容: 我有逻辑,包括从一个系统中选择大量记录,执行多个转换(基于业务规则)并将它们插入到另一个系统中。 将这些记录中的每一个实例化为一个对象,对它们执行转换,然后将所有这些对象插入另一个系统,似乎是一种高性能(和内存)。 在DDD中实现此目标的最佳方法是跳过类/对象并直接通过SQL(也许是存储过程)来做到这一点吗? 有没有更好的方法使用DDD来实现此目标? 注意:系统使用SQL数据库,目前不