首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-静态滚动到页面更改的顶部

React-静态滚动到页面更改的顶部
EN

Stack Overflow用户
提问于 2020-04-24 22:09:15
回答 2查看 338关注 0票数 0

有没有办法在使用react-static更改页面时滚动到顶部?我使用的是react-static默认包含的@reach/router

我已经试过了:

代码语言:javascript
复制
<Router onChange={window.scrollTo(0,0)}>
   <Routes path="*"/>
</Router>

ans这个(从这个issue)

代码语言:javascript
复制
<Router history={history} autoScrollToTop={true}>
   <Routes path="*"/>
</Router>

但这两种方法都不起作用。

在react-static文档中提到了最后一个解决方案,但似乎已被弃用,因为它不再出现在文档中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-25 22:56:54

需要创建一个新的组件Scrolltotop.js

代码语言:javascript
复制
import { useEffect } from 'react'
import { useLocation } from '@reach/router'

export default function Scrolltotop () {
  const { pathname } = useLocation()

  useEffect(() => {
    window.scrollTo(0, 0)
  }, [pathname])

  return null
}

并将其导入到App.js

代码语言:javascript
复制
import Scrolltotop from './components/Scrolltotop'

并将其添加到App函数中:

代码语言:javascript
复制
function App () {
  return (
    <Root>
      <Scrolltotop/>
      <Router>
        <Routes path="*"/>
      </Router>
    </Root>
  )
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-24 22:54:20

试着让一个组件为你处理滚动,并位于你的app组件之上。

用法:

代码语言:javascript
复制
import ManageScroll from './ManageScroll';
ReactDOM.render(<Fragment><ManageScroll/><App/></Fragment>, node);

ManageScroll.js:

代码语言:javascript
复制
import React from "react";
import { Location } from "@reach/router";

let scrollPositions = {};

class ManageScrollImpl extends React.Component {
  componentDidMount() {
    try {
      // session storage will throw for a few reasons
      // - user settings
      // - in-cognito/private browsing
      // - who knows...
      let storage = JSON.parse(sessionStorage.getItem("scrollPositions"));
      if (storage) {
        scrollPositions = JSON.parse(storage) || {};
        let { key } = this.props.location;
        if (scrollPositions[key]) {
          window.scrollTo(0, scrollPositions[key]);
        }
      }
    } catch (e) {}

    window.addEventListener("scroll", this.listener);
  }

  componentWillUnmount() {
    window.removeEventListener("scroll", this.listener);
  }

  componentDidUpdate() {
    const { key } = this.props.location;
    if (!scrollPositions[key]) {
      // never seen this location before
      window.scrollTo(0, 0);
    } else {
      // seen it
      window.scrollTo(0, scrollPositions[key]);
    }
  }

  listener = () => {
    scrollPositions[this.props.location.key] = window.scrollY;
    try {
      sessionStorage.setItem(
        "scrollPositions",
        JSON.stringify(scrollPositions)
      );
    } catch (e) {}
  };

  render() {
    return null;
  }
}

export default () => (
  <Location>
    {({ location }) => <ManageScrollImpl location={location} />}
  </Location>
);

请查看此要点以了解更多信息https://gist.github.com/ryanflorence/39a37a85254159fd7a5ca54027e175dc

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61410343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档