💨

Vue 2 + composition API環境で $router を使う

2021/03/29に公開

背景

Vue 2 環境でも @vue/composition-api を使用することで、setup() な書き方が出来ます。

MyComponent.vue
import { defineComponent, ref } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const count = ref(0);
  }
});

ただsetup()内では、今までのようにthisにはアクセスできないため、vue-routerの$routerはそのままでは使えません。

対処方法

@vue/composition-api が提供している getCurrentInstance() を使うことで、コンポーネントのインスタンスにアクセスすることが出来ます。
(なお、同名のAPIはVue 3でも提供されています

use-router.ts
import { getCurrentInstance } from '@vue/composition-api';

export function useRouter() {
  // インスタンスにアクセス
  const instance = getCurrentInstance();
  
  // `setup()`外で使用するとインスタンスは取得できません
  // https://v3.vuejs.org/api/composition-api.html#getcurrentinstance
  if (!instance) {
    throw new Error(`Should be used in setup().`);
  }
  
  // proxyが従来の`this`にあたるコンポーネントインスタンス
  return instance.proxy.$router;
}

これで、setup() で利用出来るようになります。

MyComponent.vue
import { useRouter } from '~/use-router';

export default defineComponent({
  setup() {
    const router = useRouter();
    router.push('/');
  }
});

Discussion