我正在开发一个Vue.js应用程序,而且我很难将一个锚链接到一个组件中的某个div。
我有以下主播:
<a href="#porto" class="porto-button">Porto, Portugal</a>
以及以下div:
<div id="porto" class="fl-porto">
我在哈希模式下使用vue-router。
问题是,每当我点击&#34; porto-button&#34;它会将我重定向到&#34; home&#34;页面(&#39; /&#39;)
我正在使用Vue.js 1.X,我尝试使用历史记录模式(没有hashbang的URL),但刷新页面时出现cannot GET '/page'
错误。
我做错了吗?我该怎么办?
答案 0 :(得分:12)
因为您在哈希模式下使用路由器,所以无法轻松滚动它,因为滚动到/#something
实际上会将您重定向到“某事”页面。
您必须自己模仿滚动行为,尝试做类似的事情:
//P.S. the code is written for Vue 2.
//You will have to adjust it to Vue 1.
//Your view:
<a class="porto-button" @click="scrollMeTo('porto')">Porto, Portugal</a>
...
<div ref="porto" class="fl-porto">
//Your code:
methods: {
scrollMeTo(refName) {
var element = this.$refs[refName];
var top = element.offsetTop;
window.scrollTo(0, top);
}
}
工作原理:
ref
属性将引用设置为您要滚动到的元素; window.scrollY
设置为引用元素的top
。更新1:
jsfiddle https://jsfiddle.net/5k4ptmqg/4/
更新2:
似乎在Vue 1 ref="name"
看起来像el:name
(docs),这是一个更新的示例:
答案 1 :(得分:3)
什么对我有用
<router-link to="#leaders">Leaders</router-link>
或动态
<router-link :to="`#${subMenuItem.linkTarget}`" class="page-submenu-list__link">
{{subMenuItem.linkTitle}}
</router-link>
在路由器中
routes:[],
scrollBehavior (to, from, savedPosition) {
//https://router.vuejs.org/guide/advanced/scroll-behavior.html
if (to.hash) {
return { selector: to.hash }
} else if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 }
}
}
答案 2 :(得分:1)
另一种方法是使用“ scrollIntoView()”
因此,euvl的代码仍然存在,只是您需要稍微更改方法:
new Vue({
el: '#app',
methods: {
goto(refName) {
var element = this.$els[refName];
element.scrollIntoView();
}
}
})
如果您想花哨并平滑滚动,甚至可以添加以下内容:
element.scrollIntoView({ behavior: 'smooth' });
请注意,这对于较旧的浏览器将需要使用polyfill。
答案 3 :(得分:1)
另一种解决方案是使用v-scroll-to
伪指令(webpage,github)。
我发现此解决方案干净,简单,灵活且有效。要使用:
安装:
npm install --save vue-scrollto
具有Vue“使用”它:
var VueScrollTo = require('vue-scrollto');
Vue.use(VueScrollTo)
将其作为指令应用于Vue组件的模板中:
<a href="#" v-scroll-to="'#element'">Scroll to #element</a>
<div id="element">
Hi. I'm #element.
</div>
或通过编程将其应用到Vue组件的方法中:
this.$scrollTo('#element', 500, { easing: 'ease-in-out' })
或通过编程将其应用到您的Vuex操作中:
import { scrollTo } from 'vue-scrollto'
scrollTo('#element', 500, { easing: 'ease-in-out' })
另一种解决方案,如果您已经在使用Vuetify,则可能更喜欢使用Vuetify's built-in programmatic scrolling method,$vuetify.goTo()
:
<v-btn @click="$vuetify.goTo('#element', {duration: 500, easing: 'easeInOutCubic'})">
Scroll to #element
</v-btn>
<div id="element">
Hi. I'm #element.
</div>
答案 4 :(得分:1)
如果你在一个元素上设置了 ref="something"
,你也可以将这个 oneliner 与 @click
一起使用:
<a @click="$refs.something.$el.scrollIntoView()">
Go to something
</a>