在导航到新页面后,停止 Reach Router 滚动页面。
问题原因:在使用Reach Router导航到新页面后,页面会自动滚动到页面底部,而不是停留在页面顶部。这可能会导致用户在导航后需要重新滚动页面以查看新内容。
解决方法:通过使用React的useLayoutEffect()钩子而不是useEffect()钩子,可以解决页面滚动问题。这样,滚动操作将在DOM完全渲染之后发生,因此不会出现奇怪的"弹跳"现象。
以下是解决方法的代码示例:
// ScrollToTop.js import React from 'react' export const ScrollToTop = ({ children, location }) => { React.useLayoutEffect(() => window.scrollTo(0, 0), [location.pathname]) return children }
如果您正在使用代码拆分和React.Suspense,还需要在使用fallback组件时,将上述钩子添加到没有location参数的情况下,即`useLayoutEffect(() => window.scrollTo(0,0))`。否则,页面将无法滚动到顶部。
这样做之后,页面在导航到新页面后将停留在顶部,并且可以使用平滑滚动效果来实现良好的动画效果。即使在一个React静态应用中,其他答案对我来说都没有解决这个问题,即使使用了`primary={false}`也不行。
停止使用Reach Router在导航到新页面后向下滚动页面是一个常见的问题。这个问题的原因是,默认情况下,Reach Router会使用HTMLElement.focus()函数来将焦点聚焦在匹配的
在解决这个问题时,通常会有一个错误的解决方法,即在主要的
那么,有没有其他解决方法呢?实际上,目前看来,无法避免HTMLElement.focus()函数的滚动行为。因此,如果你想要可访问性功能,就必须接受滚动行为。但是,有一个解决方法,就是在每次路由改变时手动滚动到页面顶部,使用window.scrollTo(0, 0)函数可以实现这个目的。这样做不会破坏可访问性功能,但可以从用户体验的角度修复滚动行为。
下面是一个实现这个解决方法的示例代码:
class OnRouteChangeWorker extends React.Component { componentDidUpdate(prevProps) { if (this.props.location.pathname !== prevProps.location.pathname) { this.props.action() } } render() { return null } } const OnRouteChange = ({ action }) => ({({ location }) => ) const Routes = () => ( <>} { window.scrollTo(0, 0) }} /> > )
这个解决方法虽然有点hacky和命令式,但是我认为这是解决这个问题的最佳方法,也是唯一的方法,而不会破坏可访问性。通过在每次路由改变时手动滚动到页面顶部,可以避免滚动行为,并保持可访问性功能的完整性。
问题:在导航到新页面后,停止Reach Router向下滚动页面的问题。
原因:默认情况下,Reach Router会在位置转换时管理焦点。这可能会导致页面滚动到奇怪的偏移位置。
解决方法:尝试使用`
注意:如果您担心破坏可访问性,请查看此答案:https://stackoverflow.com/a/56996986/428780
警告:我不建议这种方法。这会破坏可访问性,而使用Reach Router的主要原因之一就是可访问性。有关更多信息,请参见我的答案。
我理解您担心其他人使用此解决方案,但正如提问者所说:“我假设这是为了可访问性,但对于我的应用程序来说这是不必要的”,所以这对他来说是正确的解决方案。
是的,这很公平。我并不是说您没有解决提问者的问题。我只是想提醒一下,对于大多数使用Reach Router的人来说,这可能不是最佳的通用解决方案,因为其他人可能只是匆忙地选择了投票数远远超过其他答案的答案而错过了这个细节。