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>
解決策
使用している変数・メソッドがdata
やcomputed
、methods
に存在するか確認。
🧨 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回唱えてみましょう。
「このエラー、なぜ出るの?」