【问题标题】:scrollBehavior in vue-router, return back to looped data's positionvue-router中的scrollBehavior,返回循环数据的位置
【发布时间】:2025-12-23 01:20:12
【问题描述】:

我在返回页面之间的相同滚动位置时遇到了一些问题。问题是我正在迭代数据

<template>
    <router-link class="type-atag" v-for="item in types" :key="item.id" :to="{name:'plan_detail', params:{pid:item.id}}">
       <ul class="flex align-ver align-hor column type-btn">
          <li class="btn-item">{{item.kind}} <span>{{item.menu}}</span></li>
          <li class="btn-item">{{item.type}}</li>
       </ul>
    </router-link>
</template>

用户进入点击id的详情页面。然后再次回到主框架。但正如您所愿,我不想再次显示页面顶部。所以我尝试使用 vue-router 的scrollBehavior() 但有一个hash 的问题。因为不能给#id的迭代数据……

解决此问题的最佳方法是什么?例如有没有办法可以滚动到item.id

【问题讨论】:

  • 您可以尝试在单击一个项目时将包含 itemId 的查询附加到 URL。每当安装主框架时,查找查询,提取 itemId 并在有项目 ID 时滚动到它。如果使用query有点麻烦,可以vuex store/local/session storage来存储上次访问的itemId吗
  • 好的,问题是我如何滚动到item.id@NgocTuanLam

标签: vue.js vue-router


【解决方案1】:

如果item组件已经拿到id,你可以写一个滚动的方法,在mounted hook中调用。

  goTo(id) {
          const position = document.getElementById(id).offsetTop;
          // smooth scroll
          window.scrollTo({ top: position, behavior: "smooth" });  
   }

如果你使用的是 vue 参考

goTo(id) {
          const position = this.$refs[id][0].$el.offsetTop;
          // smooth scroll
          window.scrollTo({ top: position, behavior: "smooth" });  
   }

【讨论】:

  • 有一个问题。 window.scrollTo({ top: pos, behavior: "smooth" }); 不工作。我收到了offsetTop,但它没有在那里滚动...
  • 这很奇怪,一个原因可能是在页面完全呈现之前激活了 scrollTo 功能 - 但我也不确定。为了快速确认这一点,您可以在 goTo() 方法中添加延迟,获取位置并在 3 秒后滚动,看看它是否有效
  • 这几乎是我的错误,我现在明白了。谢谢!