📖

nuxt-property-decoratorは@Componentを書かないと正しく実装できない

2024/11/19に公開

困ったこと

新規でコンポーネントを作成しているときに、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の機能が正しく連携する

ドキュメントリンク

https://class-component.vuejs.org/

Discussion