vue3 使用watch监听响应式对象时出现新旧值一致问题的解决方案

问题:

官方文档标明,监听响应式对象时会自动打开deep:true深层模式

因而笔者写了如下代码想要试一下页面展示情况 

let state = reactive({ item: 1 });
watch(
  state,
  (newVal, oldVal) => {
    console.log(oldVal, "oldVal");
    console.log(newVal, "newVal");
  }
);
state.item = 5;

正常情况下,浏览器输出应当为:oldVal:{item:1},newVal:{item:5}

但运行程序后页面展示为:

查阅资料后发现,vue在watch监听时:在变异 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变异之前值的副本。 

解决:

将代码改为如下方式

state = reactive({ item: 1 });
let newState = computed(() => {
  return JSON.stringify(state);
});
watch(
  newState,
  (newVal, oldVal) => {
    console.log(JSON.parse(oldVal), "oldVal");
    console.log(JSON.parse(newVal), "newVal");
  }
);
state.item = 5;

通过计算属性,将响应式对象转换为ComputedRef<string>的响应式字符串,之后监听这个字符串,将解包后的旧值新值转为对象形式即可

页面输出为:

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值