如何使用反应路由器 dom v6 在路由更改时滚动到顶部?

Posted

技术标签:

【中文标题】如何使用反应路由器 dom v6 在路由更改时滚动到顶部?【英文标题】:How to scroll to top on route change with react router dom v6? 【发布时间】:2022-01-08 14:32:19 【问题描述】:

如何使用 react router dom v6 在路由更改时滚动到顶部?

我已经尝试过react-router scroll to top on every transition,这是我在使用react-router-dom v5 时让我的页面在路线更改时滚动到顶部的解决方案。现在,我正在使用react-router-dom v6,但这个解决方案不起作用。

我尝试了React-router v6 window.scrollTo does not work,但对我不起作用。

我试过https://github.com/remix-run/react-router/issues/7365,也就是用preload属性触发scrollTo(0,0),对我也不起作用。

【问题讨论】:

滚动到顶部在版本之间并没有真正改变,你的代码在做什么不起作用?请提供Minimal, Complete, and Reproducible Code Example。此外,preload 不是 RRDv6 中的道具。 【参考方案1】:

好吧,我不太确定您的布局是什么样的,但在您的 <BrowserRouter /> 中,您可以将您的应用程序包装在一个包装器中,并检查 useLayoutEffect 中的位置变化。然后,如果有更改,您可以滚动到顶部。这是一个粗略的例子。

import  BrowserRouter, Routes, Route, Link, useLocation  from 'react-router-dom'
import  useLayoutEffect  from 'react'

const Wrapper = (children) => 
  const location = useLocation();
  useLayoutEffect(() => 
    document.documentElement.scrollTo(0, 0);
  , [location.pathname]);
  return children
 

const Component = (title) => 
  return (
    <div>
      <p style=paddingTop: '150vh'>title</p>
    </div>
  )


const App = () => 
  return (
    <BrowserRouter>
      <Wrapper>
        <p>Scroll the bottom to change pages</p>

        <Routes>
          <Route path="/" element=<Component title="Home"/> />
          <Route path="/about" element=<Component title="About"/> />
          <Route path="/product" element=<Component title="Product"/> />
        </Routes>

        <Link to="/">Home</Link>
        <Link to="/about">About</Link>
        <Link to="/product">Product</Link>
      </Wrapper>
    </BrowserRouter>
  )


export default App

【讨论】:

【参考方案2】:
const scrollToPosition = (top = 0) => 
  try 
    /**
     * Latest API
     */
    window.scroll(
      top: top,
      left: 0,
      behavior: "smooth",
    );
   catch (_) 
    /**
     * Fallback
     */
    window.scrollTo(0, top);
  
;

您可以使用上面的代码滚动顶部。

const didMount = useDidMount();
const router = useRouter();
const  asPath  = router;
useEffect(() => 
    if (didMount) 
      scrollToPosition();
    
  , [asPath]);

并将上述代码添加到最顶层的父组件中。

【讨论】:

以上是关于如何使用反应路由器 dom v6 在路由更改时滚动到顶部?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试反应路由器未在 url 更改时加载组件

反应路由器 dom 重定向问题。更改 url,不渲染组件

使用反应路由器 V6 和刷新页面时我得到空白页面

使用反应路由器 v6 的反应嵌入式登录实现

React-Router-Dom v6 保护路由

在另一个组件 V6 中反应路由