Vue.jsアプリケーションを開発していますが、コンポーネント内の特定のdivにアンカーをリンクするのに問題があります。
次のアンカーがあります。
<a href="#porto" class="porto-button">Porto, Portugal</a>
および次のdiv:
<div id="porto" class="fl-porto">
ハッシュモードでvue-routerを使用しています。
問題は、「porto-button」をクリックすると、「home」ページ( '/')にリダイレクトされることです。
Vue.js 1.Xを使用しており、履歴モード(ハッシュバングのないURL)を使用しようとしましたが、cannot GET '/page'
ページの更新時のエラー。
私は何か間違っていますか?これについて何ができますか?
ルーターをハッシュモードで使用しているため、/#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) のように見えました。更新された例は次のとおりです。
私のために働いたもの
<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 }
}
}
別の方法は、「scrollIntoView()」を使用することです
そのため、メソッドをわずかに変更する場合を除き、euvlのコードはまだ有効です。
new Vue({
el: '#app',
methods: {
goto(refName) {
var element = this.$els[refName];
element.scrollIntoView();
}
}
})
凝ったものにしてスクロールをスムーズにしたい場合は、以下を追加することもできます:
element.scrollIntoView({ behavior: 'smooth' });
これには、古いブラウザ用のポリフィルが必要になることに注意してください。