在页面刷新时反应滚动到顶部 - 不要恢复位置

Tim*_*Tim 2 javascript reactjs

我目前正在尝试在页面刷新时滚动到顶部。到目前为止,我已经能够在路线更改时实现滚动到顶部,但不能在页面刷新时实现 - 不知何故反应总是恢复其先前的位置。我怎样才能防止这种情况发生?

这就是我实现滚动到顶部的方式(认为window.scrollTo(0, 0)内部componenDidMount()会有所帮助,但它没有):

class ScrollToTop extends Component {

    componentDidMount() {
        window.scrollTo(0, 0);
    }

    componentDidUpdate(prevProps, prevState, snapshot) {
        if (this.props.location.pathname !== prevProps.location.pathname) {
            window.scrollTo(0, 0);
        }
    }

    render() {
        return null;
    }
}

export default withRouter(ScrollToTop);
Run Code Online (Sandbox Code Playgroud)
class App extends Component {

    render() {
        return (
            <BrowserRouter>
                <ScrollToTop/>
                <Header/>
                <Home/>
                <Projects/>

                <div className="follow-cursor"/>
            </BrowserRouter>
        );
    }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

kia*_*hws 6

你可以使用一些纯 JS:

window.onbeforeunload = function () {
  window.scrollTo(0, 0);
}
Run Code Online (Sandbox Code Playgroud)

这将使页面在重新加载之前滚动到顶部,因此重新加载结束时一切都会好起来。


Rig*_*eka 5

在 React-17.0.2 中实现滚动到顶部的自定义组件的另一种方法是使用钩子:

第1步:创建自定义组件: ScrollToTop.js

import { useEffect } from "react";
import { useLocation } from "react-router";

const ScrollToTop = (props) => {
  const location = useLocation();
  useEffect(() => {
    if (!location.hash) {
      window.scrollTo(0, 0);
    }
  }, [location]);

  return <>{props.children}</>
};

export default ScrollToTop;
Run Code Online (Sandbox Code Playgroud)

步骤2:将ScrollToTop组件调用到Root中:

const App = () => {
  return (
    <>
      <BrowserRouter>
        <Router>
          <ScrollToTop />
    <Switch> ..... </Switch>
            </Router>
      </BrowserRouter>

    </>
  );
}

export default App;
    
Run Code Online (Sandbox Code Playgroud)


小智 5

在 App.js 中尝试此解决方案。这对我有用。

  useEffect(() => {
    window.history.scrollRestoration = 'manual'
  }, []);
Run Code Online (Sandbox Code Playgroud)