vue watch 默认不监听嵌套属性变化,需监听顶层对象并配置 deep: true;初始化需定义完整结构,避免动态添加非响应式字段;推荐用 watcheffect 自动追踪依赖。

Vue 的 watch 默认不监听嵌套对象内部属性的变化,只检测对象引用是否改变。比如 obj.user.name = '张三' 不会触发监听,除非你明确告诉 Vue:要深入追踪每一层。
必须监听顶层响应式对象,并启用 deep: true
不能写成 watch(() => obj.user.name, ...) 或字符串形式 'obj.user.name' 并加 deep: true —— 这种写法无效,因为中间路径(如 obj.user)可能不是响应式代理对象。
- ✅ 正确做法:监听整个
obj,并显式配置{ deep: true } - 组合式 API 示例:
watch(() => obj, (n, o) => { /* 处理任意层级变化 */ }, { deep: true }) - 选项式 API 示例:
watch: { obj: { handler() { /* ... */ }, deep: true } }
初始化结构要完整,避免中途新增非响应式字段
Vue 的响应式系统无法自动追踪动态添加的属性(如 obj.newField = {}),除非该字段从一开始就存在于 reactive 或 ref 初始化中。

