vue-router でパスにマッチしたコンポーネントの Vue インスタンスにアクセスする

タイトルが長い。

お仕事で vue-router 絡みのプラグインを書いていてアクセスしたくなった。

VueRouter のインスタンスが router として、以下のようにプロパティを参照することでできる。

router.currentRoute.matched[0].instances['default']

あくまで内部がこうなっているというだけの話で、API として正式に提供されているものではないので注意。

matched が配列になっているのは、ネストしたルートを定義することができるから。 例えば、以下のような定義の場合、/user/3/profile のようなパスでアクセスしたら、/users/3 で1回、/users/3/profile でもう1回マッチすることになる。

{
  path: '/users/:id',
  component: User,
  children: [
    {
      path: 'profile',
      component: UserProfile
    },
  ],
}

instances がオブジェクトになっているのは名前付きビューがあるため。以下のようなルーティング定義をした場合、instances オブジェクトの default, a, b それぞれのプロパティでコンポーネントの Vue インスタンスにアクセスできる。名前付きビューを使っていない場合は default プロパティを参照すれば良いです。

[
  {
    path: '/',
    components: {
      default: Foo,
      a: Bar,
      b: Baz
    },
  },
]

(keepalive コンポーネントを使うと話が変わりそうですが)インスタンスの参照はいつ変更される分からないので、参照を変数に入れて、使いまわすとかはしないほうがよさそう。