Next.js 在页面路由时保持滚动位置

Posted

技术标签:

【中文标题】Next.js 在页面路由时保持滚动位置【英文标题】:Next.js maintain scroll position when page Routing 【发布时间】:2020-04-23 16:19:27 【问题描述】:

我目前正在 Next.js 样板上创建一个网站。

我的路由代码是这样的。 (下)

import Link from 'next/link'


<Link href= pathname: '/some-url', query:  param: something  >
  <div>
    <button type="button" onClick=handleClickMore><span>+ More</span></button>
  </div>
</Link>

当我点击&lt;Button&gt; 时,我不想移动滚动位置。 但如您所知,当新页面被路由时,它会移动到顶部。有没有人知道在加载新页面时保持滚动位置。

【问题讨论】:

【参考方案1】:
<Link scroll=false href="/"><a>Home</a></Link>

scroll=false 将禁用滚动到顶部的页面更改该特定链接。

参考:https://github.com/zeit/next.js/issues/3950

【讨论】:

【参考方案2】:

谢谢你的回答 LDS 我想我找到了答案

当使用 Router.push() 页面滚动位置不移动。

解决方案代码是这样的。


import Link from 'next/link'

const handleClickMore = () => 
  Router.push(
    pathname: '/story/category/movie/movielist',
    query:  category: props.category, page: (parseInt(props.page) + 1) 
  )



<Link href= pathname: '/some-url', query:  param: something  >
  <div>
    <button type="button" onClick=handleClickMore><span>+ More</span></button>
  </div>
</Link>

仅供参考,我已跳过组件声明代码。

【讨论】:

这似乎打破了 Next 10 :(【参考方案3】:

You may disable the scrolling There are two examples bellow

.scrollDisabled    
    position: fixed;
    margin-top: 0;// override by JS to use acc to curr $(window).scrollTop()
    width: 100%;

JS

var y_offsetWhenScrollDisabled=0;

function disableScrollOnBody()
    y_offsetWhenScrollDisabled= $(window).scrollTop();
    $('body').addClass('scrollDisabled').css('margin-top', -y_offsetWhenScrollDisabled);

function enableScrollOnBody()
    $('body').removeClass('scrollDisabled').css('margin-top', 0);
    $(window).scrollTop(y_offsetWhenScrollDisabled);




Another way 



.stop-scrolling 
  height: 100%;
  overflow: hidden;



$('body').addClass('stop-scrolling')

【讨论】:

非常感谢您的回答,但在 next.js 样板上通常不会与 jQuery 库混淆。 嘿,您可以通过谷歌搜索上述函数将 jquery 更改为 next.js,例如 $(window).scrollTop() 将是 componentDidMount() window.addEventListener('scroll', this.onScroll , 错误的); componentWillUnmount() window.removeEventListener('scroll', this.onScroll, false);

以上是关于Next.js 在页面路由时保持滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

如何不在 Next.js 动态路由之间保持状态?

Next.js:在实现私有路由时,如何在重定向之前防止未经授权的路由/页面的闪烁?

动态路由在使用 Next.js 刷新页面时不起作用

Next.js-express 动态路由导致页面重新加载

Next.js 在下一页的 getInitialProps 完成加载时保持当前页面处于活动状态并重新渲染

在 Next.js 应用程序中找不到 API 路由(找不到该页面)