在Vue3中,使用watch
监视reactive
对象时,需根据监视的目标选择合适的方法。以下是详细的步骤和说明:
1. 监视整个reactive
对象
-
自动深度监视:直接监视
reactive
对象时,Vue3会默认启用深度监视,无需设置deep: true
。
javascript
复制
import { reactive, watch } from 'vue';const state = reactive({count: 0,user: { name: 'Alice' } });// 监视整个state对象的变化 watch(state, (newState) => {console.log('State changed:', newState); });// 修改内部属性会触发回调 state.user.name = 'Bob'; // 触发
2. 监视基本类型属性
-
使用Getter函数:对于基本类型(如
count
),使用Getter函数确保正确追踪。
javascript
复制
watch(() => state.count, (newCount, oldCount) => {console.log(`Count changed: ${oldCount} → ${newCount}`); });state.count++; // 触发,输出: Count changed: 0 → 1
3. 监视对象类型属性
-
需要深度监视:使用Getter函数返回对象属性,并显式设置
deep: true
以检测内部变化。
javascript
复制
watch(() => state.user,(newUser, oldUser) => {console.log('User changed:', newUser);},{ deep: true } // 启用深度监视 );state.user.name = 'Charlie'; // 触发
-
替换对象时触发:即使未设置
deep: true
,替换整个对象也会触发。
javascript
复制
watch(() => state.user, (newUser) => {console.log('User replaced:', newUser); });state.user = { name: 'David' }; // 触发
4. 注意事项
-
旧值问题:深度监视时,
newValue
和oldValue
指向同一对象,需通过其他方式获取旧值。 -
直接监视响应式属性:避免直接监视属性(如
watch(state.user, ...)
),可能导致替换后失效。
总结
-
整个对象:直接监视,自动深度。
-
基本属性:使用Getter,无需
deep
。 -
对象属性:使用Getter +
deep: true
检测内部变化。
通过合理选择监视方式,可以高效追踪reactive
对象及其嵌套属性的变化。