【问题标题】:history.replaceState() not working with history.scrollRestoration = 'auto' in Svelte/Sapperhistory.replaceState() 在 Svelte/Sapper 中不能与 history.scrollRestoration = 'auto' 一起使用
【发布时间】:2020-06-11 18:16:43
【问题描述】:

我正在使用history.replaceState() 来更新我的页面的查询参数,而不会按照this SO answer 中的建议导致页面重新加载。

function setQueryParam ({ name, value }) {
  const params = new URLSearchParams(window.location.search)

  params.set(name, value)
  history.replaceState({}, '', decodeURIComponent(`${window.location.pathname}?${params}`))
}

我还使用以下行存储用户的滚动位置:

history.scrollRestoration = 'auto'

当从一个页面导航到另一个页面时,scrollRestoration 工作正常 - 页面之间的滚动位置保持不变。但是,之后我用 setQueryParam 函数更改了查询参数,滚动恢复不再起作用。

为什么会这样?

注意:相同的代码在 Svelte/Sapper 之外也能正常工作,仅使用 HTML 和 JavaScript。

【问题讨论】:

    标签: scroll navigation svelte sapper


    【解决方案1】:

    作为客户端路由器,Sapper 必须大量劫持滚动管理和恢复,以模拟在每次页面更改时完全重新加载浏览器时通常会出现的行为。

    为此,uses history's state 知道要恢复的滚动位置。

    当您使用history.replaceState 时,您正在更改状态(这是您放置给replaceState 的第一个参数)。因此,当您稍后弹出状态时,Sapper 不会找到它的恢复滚动数据。

    您可以尝试像这样手动保留历史状态:

    // notice the first argument
    history.replaceState(history.state, '', decodeURIComponent(`${window.location.pathname}?${params}`))
    

    我认为history.scrollRestoration 实际上对 Sapper 没有任何影响。

    【讨论】:

    • “我不认为 history.scrollRestoration 实际上对 Sapper 有任何影响。” - 确实如此,因为如果我不替换状态,滚动位置将保持不变。
    • 但是如果你改变history.scrollRestauration的值,它的行为会有什么不同吗?我的意思是我不认为 Sapper 在它实现的滚动管理/恢复中考虑了这个选项。您是否尝试过传递history.state
    • 你说得对,我删除了history.scrollRestauration = 'auto',它仍然保持滚动位置。此外,我尝试将history.state 作为replaceState() 中的第一个参数,现在一切似乎都按预期工作。有两件奇怪的事情,然而,首先,我认为 history.state 只是用户定义的 JSON 对象,但显然其中有私人信息,或者 Sapper 在幕后使用它。其次,我在我的另一个项目中尝试了同样的方法,即使没有通过history.state,一切正常。无论如何,非常感谢您的回答!
    • history.state 是对的,它没有附加默认浏览器行为。我还没有深入研究代码,但我几乎可以肯定是 Sapper 在里面放了一些东西。你的其他项目也使用 Sapper 吗?因为可以在没有history.state 的情况下保留历史数据,在这种情况下,功能不会受到replaceState 的影响。
    • 是的,我特意尝试了另一个使用相同版本的 Svelte 和 Sapper 的项目。无论如何,再次非常感谢!你为我节省了大量时间!
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2020-02-04
    • 2020-04-09
    相关资源
    最近更新 更多