📖
nuxt-property-decoratorは@Componentを書かないと正しく実装できない
困ったこと
新規でコンポーネントを作成しているときに、Vue Routerを使用したページ遷移が機能せず、
以下のエラーが発生しました。
エラー内容
TypeError: Cannot read properties of null (reading '$router')
<template>
<div>
<div>
<p>
<span @click="toLink">こちら</span>から遷移してください
</p>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
export default class TheLink extends Vue {
toLink() {
this.$router.push({
path: '/order',
})
}
}
</script>
解決
この問題は、TypeScriptでVueコンポーネントを作成する際に必要な@Componentデコレータが不足していたことが原因でした。
Vue Class Componentを使用する場合、クラスコンポーネントとして認識させるために@Componentデコレータを付ける必要があります。これにより、Vueインスタンスのプロパティ($routerなど)が正しく初期化されます。
以下が修正後の正しいコードです:
<template>
<div>
<div>
<p>
<span @click="toLink">こちら</span>から遷移してください
</p>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import { Component } from 'nuxt-property-decorator' //追加
@Component({}) // 追加
export default class TheLink extends Vue {
toLink() {
this.$router.push({
path: '/order',
})
}
}
</script>
この修正により、以下の点が改善されました:
- コンポーネントが正しくVueインスタンスとして初期化される
- $routerなどのVueインスタンスプロパティにアクセスできるようになる
- TypeScriptとVue Class Componentの機能が正しく連携する
ドキュメントリンク
Discussion