1. 忘记提供道具
道具是父组件向子组件传递数据的单向数据流。如果没有提供道具,子组件将无法访问父组件中的数据。
// 父组件
<my-component />
// 子组件
<template>
<p>{{ prop }}</p>
</template>
解决方案: 在父组件中使用 v-bind
指令传递道具。
// 父组件
<my-component :prop="someProp" />
2. 使用无效的道具名称
道具名称必须是有效的 JavaScript 标识符,也就是说,它们只能包含字母、数字和下划线。无效的名称将导致错误。
// 父组件
<my-component :property-name="someProp" />
解决方案: 确保道具名称遵循 JavaScript 标识符的约定。
3. 试图修改道具
道具是单向绑定的,这意味着子组件不能修改父组件传递的道具。尝试修改道具将导致错误。
// 子组件
<template>
<input v-model="prop" />
</template>
解决方案: 使用 computed
属性或 watch
侦听器来响应道具的变化,而不是试图修改它们。
4. 使用无效的事件名称
事件是子组件向父组件发送自定义事件的机制。使用无效的事件名称将导致错误。
// 子组件
<template>
<button @click="fireEvent">Click Me</button>
</template>
解决方案: 确保事件名称遵循驼峰命名法,例如 fireEvent
。
5. 忘记监听事件
如果没有在父组件中监听事件,子组件发送的事件将不被处理。
// 父组件
<template>
<my-component />
</template>
解决方案: 在父组件的 v-on
指令中使用 @
监听事件。
// 父组件
<template>
<my-component @fireEvent="handleEvent" />
</template>
6. 使用无效插槽名称
插槽是允许子组件定义可由父组件填充的内容标记的机制。使用无效的插槽名称将导致错误。
// 父组件
<my-component>
<template v-slot:default>
<h1>Hello</h1>
</template>
</my-component>
解决方案: 确保插槽名称遵循驼峰命名法,例如 default
。
7. 忘记使用 $refs
$refs
对象允许父组件访问其子组件的 DOM 元素。忘记使用 $refs
将导致错误。
// 父组件
<template>
<my-component ref="child" />
</template>
<script>
this.$refs.child.focus() // 错误:child 未定义
</script>
解决方案: 在父组件中使用 $refs
对象来引用子组件。
8. 使用错误的生命周期钩子
生命周期钩子允许组件在特定时刻执行代码。使用错误的生命周期钩子将导致错误。
// 子组件
<template>
<p>{{ prop }}</p>
</template>
<script>
// 在错误的生命周期钩子中访问道具
beforeCreate() {
console.log(this.prop) // 错误:prop 在此生命周期钩子中不可用
}
</script>
解决方案: 确保在正确的生命周期钩子中使用道具和其他组件状态。
9. 依赖于非响应式数据
非响应式数据不会响应 Vue 组件状态的变化。如果子组件依赖于非响应式数据,它将不会更新。
// 父组件
const nonReactiveData = {
count: 0
}
// 子组件
<template>
<p>{{ nonReactiveData.count }}</p>
</template>
解决方案: 将响应式数据存储在 Vuex 存储或使用 computed
属性来使其响应式。
10. 忘记更新道具
当父组件状态变化时,必须更新子组件的道具。忘记更新道具将导致子组件显示过时的数据。
// 父组件
<my-component :prop="prop" />
<script>
this.prop = "New Value" // 道具未更新
</script>
解决方案: 使用 watch
侦听器在父组件中检测道具的变化,并相应地更新子组件的道具。