我正在使用Gatsby 2.2.10建立一个网站,并且Link组件保留了前一页的滚动位置,并且在单击它们时不会滚动回到顶部。
<div className="Footer__legal body">
<p>© {new Date().getFullYear()} Fiftyone3</p>
<Link to="/privacy-policy">Privacy Policy</Link>
<Link to="/page-2">Page 2 Link component</Link>
</div>
预期行为:
当您单击“隐私策略”,“第2页”或网站底部的任何页面时,我希望该页面加载时用户会回到顶部。
实际行为:
用户停留在当前页面的滚动位置
答案 0 :(得分:2)
如果您在overflow: hidden
上设置了overflow: auto
或body
,则会遇到此问题!
答案 1 :(得分:2)
如果页面是无状态功能组件,则可以使用useEffect
钩子返回到页面顶部,前提是您使用的是graphql
,因此您的组件将一些数据一个争论。这样,每次data
更改时,您都滚动到页面顶部(工作方式类似于componentDidUpdate)。
const PageCmp = ({ data }) => {
...
useEffect(() => {
window.scrollTo(0,0)
}, [data])
...
}
答案 2 :(得分:1)
好的,这是一个古老的问题,但是我最近也面临着同样的奇怪行为。事实证明,我的问题不同于到目前为止在互联网上看到的所有其他解决方案。
Gatsby使用名为gatsby-react-router-scroll
的软件包。该程序包管理Gatsby的滚动行为。此行为主要在Scroll Handler组件中实现。该组件仅以componentDidUpdate
方法向上滚动,而不以componentDidMount
方法向上滚动。我在debugger
方法中添加了componentDidMount
,并且在每次导航时都重新安装了ScrollHandler组件。
解决方法是弄清楚为什么在每次导航时都要安装和重新安装此组件。就我而言,我在React.StrictMode
的{{1}}函数上有一个wrapRootElement
组件。删除StrictMode使ScrollHandler组件稳定,从而解决了我的问题。
答案 3 :(得分:1)
useEffect(() => window.scrollTo(0, 0), [])
为我解决了这个问题。我只在Firefox上有问题,而在chrome上没有。知道是什么导致了问题,但现在可以正常使用。
答案 4 :(得分:1)
在我的 CSS 中,我有
html, body {
height: 100%;
overflow-y: scroll;
}
因为这是修复仅限移动 safari 的错误的唯一方法(我的最爱!)
如果您也无法摆脱 overflow
属性,我建议这样做:
// in gatsby-browser.js
export function shouldUpdateScroll(prevRouterProps, { location }) {
window.scrollTo(0, 0)
const body = document.getElementsByTagName('body')[0]
body.scrollTop = 0
return false
}
答案 5 :(得分:0)
通过将index.js页面转换为基于类的组件,然后添加
来找出解决方法 componentDidUpdate() {
window.scrollTo(0,0);
}
不是最干净的修复程序,也不知道为什么它没有自动滚动,下周去JS开会,所以会问一个问题,然后在我得到答案后进行跟进。
当我开始一个新项目并且Gatsby-cli没有问题时,我感觉这与我的风格有关。将重构样式以查看是否可以解决问题。
答案 6 :(得分:0)
您还可以修改gatsby-browser.js
并为每个滚动更新实现一个钩子:
// in gastby-browser.js
exports.shouldUpdateScroll = ({
routerProps: { location },
getSavedScrollPosition,
}) => {
const { pathname } = location
// list of routes for the scroll-to-top-hook
const scrollToTopRoutes = [`/privacy-policy`, `/page-2`]
// if the new route is part of the list above, scroll to top (0, 0)
if (scrollToTopRoutes.indexOf(pathname) !== -1) {
window.scrollTo(0, 0)
}
return false
}
您可以在GatsbyJS网站上的shouldUpdateScroll
on GitHub或documentation for shouldUpdateScroll
中找到代码。
答案 7 :(得分:0)
我的问题是我有spark = SparkSession.builder.master("local[*]").config("spark.jars.packages", "graphframes:graphframes:0.7.0-spark2.4-s_2.11").getOrCreate()
。删除该规则似乎已经解决了问题。
我的项目中也有html {height: 100%}
,为我的主要内容添加了更多包装器。