【BootstrapVue】Navにリンクを設定しても遷移しないことがある

bootstrapvue
Navにリンクを設定するときは href でやれば良さそうな気がするんですが、実際にやってみるとルーティングが設定されていないページへのリンクは動かないようです。


<b-nav-item-dropdown text="Dropdown">
 <b-dropdown-item href="/existing-page">存在するページ</b-dropdown-item>
 <b-dropdown-item href="/unexisting-page">存在しないページ</b-dropdown-item>
</b-nav-item-dropdown>

上の例では、存在するページの方をクリックするとSPAでページ遷移しますが、存在しないページの方は何も起こらずにそのままになります。


href ではなく to を使う

こうすると遷移してくれるようにはなります。

<b-nav-item-dropdown text="Dropdown">
 <b-dropdown-item to="/existing-page">存在するページ</b-dropdown-item>
 <b-dropdown-item to="/unexisting-page">存在しないページ</b-dropdown-item>
</b-nav-item-dropdown>

単純に存在しないページへのリンクなら404が表示されます。しかし今度は外部リンクに遷移できなくなります。理由は to を使うと router-link を利用しVue内部のページ遷移と解釈されるからです。



僕の事情: SPAページとレガシーページが共存している

通常はただ404が表示されるようになるだけなんですけど、僕が今触っているプロジェクトではもうちょっと様子が違います。そのプロジェクトではPHPフレームワーク上のレガシーなページをVueを使ったSPAに段階的に移行中なので、同じドメイン内にSPAへ移行済みのページと、移行前のレガシーなページとが共存しています。で、移行済みのページをhtaccessでPHPフレームワークへの遷移から除外していくイメージ(先達の決定した方針による)。つまり、VueRouter的には存在しないページだけどURL的には存在するページというのがあり得ます。

to を使うとページリンクは機能するけど、全て内部リンクと解釈してしまうので、全部404になってしまうんですね。本当はレガシーページに飛ばしたいのに。ダメじゃん。



どうすんの

どうやっても綺麗には片付けられなさそうなので、結局はこういう対応をすることにしました。


<b-nav-item-dropdown text="Dropdown">
 <b-dropdown-item to="/existing-page">存在するページ</b-dropdown-item>
 <b-dropdown-item to="/unexisting-page" @click="onClick">存在しないページ</b-dropdown-item>
</b-nav-item-dropdown>

methods: {
 onClick(event) {
   location.href = event.target.href
 }
}


つまりリンク遷移にむりやり介入して、ページ遷移しちゃうっていう。で、レガシーページをVueに移行出来たら @click を削除していく。どう考えても綺麗な方針ではありませんが、仕方ないかなと思います……



参考