27
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

< nuxt-link > をpreventしたい

Last updated at Posted at 2019-07-18

便利だけど難しい <nuxt-link>

リンクタグを自動生成してくれるわ、VueRouterの操作もよしなにやってくれるわ、とめちゃくちゃ便利な <nuxt-link>
ただちょっと細かいことをやろうとすると、少しひねくれた手段が必要になる。

例えばクリックしたとき画面遷移と同時に何かしらイベントを起こしたい場合、
そのまま普通にイベントリスナをバインドするだけではダメで、.native修飾子をつけなくてはいけない。

<!-- ダメ -->
<nuxt-link to="/hogehoge" @click="fuga"> hogefuga </nuxt-link>
<!-- 良い -->
<nuxt-link to="/hogehoge" @click.native="fuga"> hogefuga </nuxt-link>

これは<nuxt-link>がルートに<a>要素が配置されたコンポーネントとして扱われるため。

<a>タグは prevent で遷移を握りつぶせるけど...

で、今回の本題はクリックした時に処理を走らせて、本来のルーター処理を握りつぶすにはどうしたらいいか。
例えばログイン状態でないと遷移しないリンクとかを作りたい時には、標準の画面遷移処理はなかったことにしないといけない。

こういう時<a>タグで実装する場合は、.prevent修飾子を使ったり、EventインスタンスのpreventDefaultを使うと標準処理を握りつぶせる。


<!-- HTMLでprevent指定を行う -->
<a href="/hogehoge" @click.prevent="fuga"> hogefuga </a>

<script>
...
  methods: {
    fuga(e) {
      // jsでpreventする
      e.preventDefault();
    }
  }
...
</script>

ところが<nuxt-link>では上記の方法でイベントを握りつぶすことができない。
VueRouterが入っているのが原因なのだとは思うが、何とかできないだろうか?

Routerイベントのトリガーを書き換える

<nuxt-link>はVueRouterのコンポーネント<router-link>の糖衣構文なわけだが、
このコンポーネントにはeventという、Routerが何のイベントをトリガーとして処理を行うかを設定するプロパティがある。

参考: Vue Router APIリファレンス

というわけで、このトリガーに対して全く無効なイベントタイプを指定してやれば、クリックしても動かなくなるという寸法。

<!-- eventトリガに何も指定しないので、/hogehogeに遷移するRouterイベントが発生しない -->
<nuxt-link to="/hogehoge" @click.native="fuga" event=""> hogefuga </nuxt-link>

このeventプロパティを動的に指定してやることで、条件に応じたnuxt-linkの操作を行うこともできるので、
例えばログイン時には"click"、未ログイン時には""を与えるようバインドする、といった条件わけも可能である。

参考リンク

27
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?