💨
Vue 2 + composition API環境で $router を使う
背景
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