VueJS 从不同的路线滚动到部分

2024-01-16

我正在尝试使用 Vue 和 Vue Router(使用历史模式)滚动到页面上的锚点。

在索引页上时,滚动行为通过跳转到该部分按预期工作。

但是,当我在另一个页面时,它会在顶部加载索引页面,而不是锚点指向的位置。

我确信这是一件非常简单的事情,但我无法理解它!

任何帮助表示赞赏!

我的路由器索引:

export default new Router({
  scrollBehavior: function(to, from, savedPosition) {
    if (to.hash) {
      return {selector: to.hash}
    } else {
      return {x: 0, y: 0}
    }
  },

  mode: 'history',
  routes: [ ... ]
})

我的导航:

<router-link @click.native="closeNav" to="/#enter">Enter</router-link>
<router-link @click.native="closeNav" to="/#prizes">Prizes</router-link>
<router-link @click.native="closeNav" to="/#faqs">FAQ</router-link>
<router-link @click.native="closeNav" to="/contactus">Contact</router-link>

Vue 路由器 v3.x

这是一个有点老的问题,OP几乎肯定已经找到了解决方案,但对于遇到这个问题的任何人来说,这应该可以解决问题:

    <router-link :to="{ name: 'Homepage', hash: '#enter' }">Enter</router-link>
    <router-link :to="{ name: 'Homepage', hash: '#prizes' }">Prizes</router-link>
    <router-link :to="{ name: 'Homepage', hash: '#faqs' }">FAQ</router-link>
    <router-link :to="{ name: 'Contact' }">Contact</router-link>

这应该允许您从其他视图/组件访问这些链接,并且单击时会将您重定向到指定的路线(在本例中为主页),并滚动到指定的哈希(#enter、#prizes、#faqs)。

除了问题中的路由器代码片段之外,您还可以使用本机添加平滑滚动window.scrollTo method:

    export default new Router({
      routes: [],
      mode: 'history',
      scrollBehavior (to, from, savedPosition) {
        if (to.hash) {
          return window.scrollTo({ 
            top: document.querySelector(to.hash).offsetTop, 
            behavior: 'smooth' 
          })
        } else {
          return { x: 0, y: 0 }
        }
      }
    })

Vue Router v4.x 更新

你写你的router-link是一样的,但是您现在可以将滚动行为和元素选择编写得更整洁一些。来自文档 https://next.router.vuejs.org/guide/advanced/scroll-behavior.html#scroll-behavior

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(),
  routes,
  scrollBehavior(to, from, savedPosition) {
    if (to.hash) {
      return {
        el: to.hash,
        behavior: 'smooth'
      }
    }
  }
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VueJS 从不同的路线滚动到部分 的相关文章

随机推荐