質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

12432閲覧

vue-routerを使ったトランジションを、戻るボタンを押したときは無効にしたい

teng

総合スコア127

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2017/12/15 14:06

###こまっていること
vue, vue-routerを使ったSPAを開発しています。
routeの変更をwatchして、リンク先によってトランジションを切り分けています。
スマホ向けに開発しているので、戻るイベント(画面端からスワイプ)が発生した際は、邪魔なのでトランジションを発生させたくありません。
戻るイベントをキャッチして、トランジションを発生させない方法をご教授いただけないでしょうか。

###やってみたこと
popstateイベント時にtransitionNameを変更すればいいと思っていたのですが、

  • watch: {'$route': ... }
  • beforeLeave
  • beforeEnter
  • popstateイベント
  • afterLeave
  • afterEnter

の順に発生するので、そのタイミングではトランジションを止めることができませんでした。
他にもページ遷移ごとに、ハッシュ値をhistorystockとして観測してみたりしたのですが、
ブラウザバックと普通にリンククリックによる違いを判別できず実現しませんでした。
考えすぎて頭がぱんぱんなのでよろしくお願い居たいします。

###該当のソースコード

html

1<transition :name="transitionName"> 2 <router-view/> 3</transition>

js

1 watch: { 2 '$route' (to, from) { 3 const toTab = to.matched[0].meta.tabNum; 4 const fromTab = from.matched[0].meta.tabNum; 5 this.transitionName = fromTab < toTab ? 'go-right-tab' : 'go-left-tab'; 6 } 7 } 8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

popstateイベント時にtransitionNameを変更すればいいと思っていたのですが、(中略)そのタイミングではトランジションを止めることができませんでした。

試してみましたがトランジションは止まりました。

DEMO(codesandbox)

transitionNamebeforeEachにてforwardに戻し、popStateイベントにてbackにしています。

Note: この例ではrouterに対してbeforeEachメソッドで登録したコールバックでtransitionNameをリセットしていますが、コールバックを解除する方法が(たぶん)ないので、消えたり現れたりするコンポーネントではしないほうがいいです。

追記

上記の方法ではうまくいかないようなので別の方法をとりました。
上記のdemoをアップデートしました(forkすべきでしたがうっかり上書きしました)。

vue-routerも内部でpopstateイベントリスナーを使っていて、イベント発生時には通常通りnavigation guardを実行したあとページ遷移しているようです。

demoではrouterがpopstateイベントリスナーを登録する前に自分のリスナー(Aとする)を登録しています(router/index.jsにて)。
これにより、ブラウザの戻るボタンを押したとき、Aはrouterが何らかの処理をする前に実行されます。

App.vueにおいて、databackはデフォルトでfalseですが、Aでbacktrueにします。

beforeEachはその後実行されるので、ブラウザバックなのかどうかはbacktruefalseかで判断できますので、transitionNameをそれに合わせてセットします。そしてbackfalseに戻します。

投稿2017/12/15 18:01

編集2017/12/16 06:42
karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teng

2017/12/16 05:17 編集

ご回答ありがとうございます。 codesandbox上では止まっていますが、ブラウザ上で確認するとトランジションが発生してしまいます。( https://3y4ypo80x6.codesandbox.io/ )。 sandboxの疑似ブラウザ上ではイベントの発生順序が違うようです。 beforeイベントの前にpopstateが呼ばれてるのですが、通常のブラウザでこれを再現する方法が思いつきません...
karamarimo

2017/12/16 06:43

少し強引な方法ですが別の方法を追記しました。
teng

2017/12/16 07:16 編集

ご提示いただいた方法で、想定の挙動を得ることができました。 ご丁寧かつ迅速なご回答、ありがとうございます。 routerがリスナーを登録する前に自分のイベントを登録するのは思いつきませんでした。 イベントの登録順を考えることや、ソースコードの中身を覗いてみることが大切だと勉強になりました。 teratailを初めて使いましたが、本当に助かりました。 ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問