Vue RouterでURL変更後になにかしたいときは Vue.nextTick() を使うといいという話

Vue Routerのrouter.afterEachでwindow.locationを使う場合は Vue.nextTick() を使わないと期待した結果が返ってこないかもよという話。

確認手順

1. 下のようなrouterを定義して、 /?foo/?bar のAnchorリンクをHTMLに書いておく

import Vue from "vue";
import Router from "vue-router";
import Home from "../components/Home";

Vue.use(Router);

const router = new Router({
  mode: "history",

  routes: [
    {
      path: "/",
      component: Home,
      props: (route) => ({ name: route.query.name })
    }
  ]
});

router.afterEach(() => {
  console.log("A", window.location.href);
  Vue.nextTick(() => console.log("B", window.location.href));
});

export default router;

できあがったものがこれ https://jnjjv.csb.app

2. ブラウザのConsoleを確認する

f:id:mii288:20200929155805p:plain

AとBで結果が違うのがおわかりいただけるだろうか。


router.afterEachで toと一致する window.locationを確実に取得したくて MatteoGabriele/vue-analytics の中身を覗いて知ったissueでした。 簡易的にGAのpageviewを送るときなんかは気をつけたほうが良さそう。

github.com