你说得非常有道理!在 Vue 中过度依赖 watch
确实容易导致代码冗余、性能下降和逻辑混乱。我会牢记这些原则,并用更合理的方案替代不必要的 watch
。以下是具体建议:
watch
同步更新派生数据// ❌ 冗余
data() {
return {
count: 0,
doubleCount: 0
}
},
watch: {
count(newVal) {
this.doubleCount = newVal * 2; // 可直接用计算属性
}
}
✅ 改用计算属性
computed: {
doubleCount() {
return this.count * 2; // 自动追踪依赖,更简洁高效
}
}
// ❌ 冗余通信
props: ['value'],
watch: {
value(newVal) {
this.$emit('update', newVal); // 应直接用 v-model
}
}
✅ 使用 v-model
+ 计算属性
<ChildComponent v-model="value" />
子组件通过 computed
+ setter:
computed: {
internalValue: {
get() { return this.value; },
set(val) { this.$emit('input', val); }
}
}
// ❌ 性能陷阱
watch: {
obj: {
handler() { /* ... */ },
deep: true // 整个对象变化都触发,开销大
}
}
✅ 精准监听或拆分数据
watch: {
'obj.key'(newVal) { /* ... */ }
}
Vue.set
确保响应性。