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