2017-07-19 12 views
4

私はVue Routerを使ってページ内のアンカーを扱うスマートな方法を探しています。次のことを考えてみましょう:Vue Routerでアンカー(ブックマーク)を扱うには?

<router-link to="#app">Apply Now</router-link> 
<!-- some HTML markup in between... --> 
<div id="app">...</div> 

除いて正常に動作しますdescribed in the docs行動を「固定するスクロール」:あなたがアンカーをクリックすると、それはdiv id="app"までをもたらします

  • 。今すぐdivからスクロールしてアンカーに戻ってもう一度クリックしてください。ではなくdivにジャンプします。実際、アンカーはクラスrouter-link-activeを保持し、URLにはまだハッシュ/#appが含まれます。
  • 上記の手順でページを更新すると(URLにはまだハッシュが含まれています)、アンカーをクリックしても何も起こりません。

これは潜在的な顧客が手動でアプリケーションセクションに到達するために手動で再びスクロールする必要があるため、UXの観点からは非常に残念です。

私はVue Routerがこのような状況をカバーしているのか疑問に思っていました。参考のために、ここに私のルータです:私はあなたの問題を解決するためのリソースには何も見つかっていない

export default new VueRouter({ 
    routes, 
    mode: 'history', 
    scrollBehavior(to, from, savedPosition) { 
     if (to.hash) { 
      return { selector: to.hash } 
     } else if (savedPosition) { 
      return savedPosition; 
     } else { 
      return { x: 0, y: 0 } 
     } 
    } 
}) 

答えて

3

ができますが、リフレッシュの問題を解決するために、あなたの<router-view></router-view>を保持している部品のごmountedフックで$route.hashをutitlizeことができます。そして、あなたは<router-link></router-link>native修飾子とバインドを使用することができます第二回のクリックの問題を解決するために

<script> 
export default { 
    name: 'app', 
    mounted: function() 
    { 
    // From testing, without a brief timeout, it won't work. 
    setTimeout(() => this.scrollFix(this.$route.hash), 1), 
    }, 
    methods: { 
    scrollFix: function(hashbang) 
    { 
     location.href = hashbang; 
    } 
    } 
} 
</script> 

。それはかなり手作業のプロセスですが、うまくいくでしょう。

<router-link to="#scroll" @click.native="scrollFix('#scroll')">Scroll</router-link> 

そこもあなたは、ルータのafterEach方法で行うことができます何かかもしれないが、まだそれを考え出したていません。 IMOよりresusableある

+0

かかわら

<a @click="this.$router.options.pushWithAnchor('home', '#fee-calculator-section')"></a> 

は、悲しいことに、あなたはスクロールオフセットを使用するカント!私は、ルータ自体にクリックイベントを割り当てる方法があったと思う。私は 'beforeEach'を試しましたが、ブックマークで起動するようには見えません。 – Alex

+0

@Alex githubリポジトリに問題を追加して、より良いアプローチがあるかどうかを確認することができます。これはほぼ確実です。 –

+0

[Vue.js forum]で同じ質問をしています(https://forum.vuejs.org/t/how-to-handle-anchors-bookmarks-with-vue-router/14563)。私はGithubを信じています。StackOverflowとフォーラムに戻ってくるのは、ある種のバグレポートでない限り、あなたを参照する傾向があります:) – Alex

0

考えられる解決策:

this.$router.push({ name: 'home' }, undefined,() => { location.href = this.$route.hash }) 

第三引数はアボート()関数であるとして、それはしかし、望ましくない副作用を有することができる。..

あなたは世界的にそれを使用したい場合、あなたのルータに機能を追加します。

pushWithAnchor: function (routeName, toHash) { 
    const fromHash = Router.history.current.hash 
    fromHash !== toHash || !fromHash 
    ? Router.push({ name: routeName, hash: toHash }) 
    : Router.push({ name: routeName, hash: fromHash }, undefined,() => { window.location.href = toHash }) 
    } 

とで構成して、それを使用します。

あなたのような何かを行うことができ、テンプレート内

:これは素晴らしいです