このエラー、なぜ出るの?と5回唱えたくなるVueエラー解説集

Vue.jsは使いやすいフロントエンドフレームワークですが、時に「何これ!?」と思わず5回は唱えたくなるような謎エラーに悩まされることがあります。

この記事では、Vueでありがちなエラーを厳選して、原因→解決法→ついでに防止策までサクッと解説します。

🧨 1. Avoid mutating a prop directly

全文例:

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders.
原因

親コンポーネントから渡されたpropを子コンポーネント内で直接変更しようとしている場合に発生。

// NGパターン
props: ['message'],
created() {
  this.message = '変えちゃうよ'; // ❌ これがアウト
}
解決策

dataでコピーして変更するか、emitで親に変更を依頼する。

props: ['message'],
data() {
  return {
    localMessage: this.message
  }
}

🧨 2. Property or method “xxx” is not defined

全文例:

[Vue warn]: Property or method "user" is not defined on the instance but referenced during render.
原因

テンプレート内で定義していない変数やメソッドを参照している。

<template>
  <p>{{ user.name }}</p> <!-- userが未定義 -->
</template>

<script>
export default {
  data() {
    return {
      profile: { name: 'Taro' }
    }
  }
}
</script>
解決策

使用している変数・メソッドがdatacomputedmethodsに存在するか確認。

🧨 3. Cannot read property ‘xxx’ of undefined

全文例:

TypeError: Cannot read property 'name' of undefined
原因

オブジェクトがまだ読み込まれていないのに、内部のプロパティへアクセスしてしまう。

解決策

オプショナルチェイニング(?.)や条件分岐で安全にアクセス。

<p>{{ user?.name }}</p>
<!-- または -->
<p v-if="user">{{ user.name }}</p>

🧨 4. v-model が効かない!?

症状:
双方向バインディングしてるはずなのに、フォームが更新されない。

原因
  • v-modelとバインドしている変数が正しく定義されていない。
  • コンポーネントでmodelValueが使われていない(Vue 3の場合)。
解決策(Vue 3コンポーネント内の場合)
// 子コンポーネント
props: ['modelValue'],
emits: ['update:modelValue'],
methods: {
  updateValue(val) {
    this.$emit('update:modelValue', val)
  }
}

🧨 5. setup()の中でthisを使って怒られる

全文例:

Uncaught TypeError: Cannot read properties of undefined (reading '$emit')
原因

Composition API(setup())ではthisは使えない。オブジェクト構文とは文脈が違うため。

解決策

代わりにsetup()の引数を使ってアクセス。

setup(props, { emit }) {
  const handleClick = () => {
    emit('click')
  }

  return { handleClick }
}

📘 まとめ

Vueのエラーは英語で出てきて一見わかりづらいですが、「何をしてはいけないのか」「どうすればVueが期待する書き方になるのか」を理解すれば、だんだん自然と読めるようになります。

次にエラーが出たときは、落ち着いて5回唱えてみましょう。

「このエラー、なぜ出るの?」

🔗 参考

タイトルとURLをコピーしました