watch监听不到对象内部的变化

有的时候vue会出现这种现象,无法监听到复杂对象内部的变化:当对象里面原本有某一个属性,并对这个属性操作时,watch是可以监听到当前属性的变化的。但是,若对象里面本没有这个属性的时候,在操作时将属性添加进去,同时包括之后对这个属性的操作,watch是都检测不到的。

这是因为vue的watch会在初始化的时候通过object.defineProperty给对象的每一个属性都添加watcher来监听内部的变化。所以,后期添加上去的属性是无法检测到的。

解决方法:

如果想在初始化后添加一个属性并进行监听操作,可以使用$set:

// this.$set(object, key, value)
// 使用this.$set就可以监听到
this.$set(this.obj, 'a', Math.random())
复制代码

watch的handler方法的两个参数值相同

一个数据,如果值发生了变化,如果想要记录变化前和变化后的两个值,可以使用handler方法,第一个参数为变化后的新值,第二个为变化前的旧值。

但是如果这个值是复杂对象,如果想记录里面的属性的变化,使用handler,两个参数均为变化后的新值。

解决方法:

结合计算属性、序列化、反序列化生成新的对象,来避免此问题

 data () {return {obj: {}}},computed: {// 如果想要得到差异内容,可以结合计算属性、序列化、反序列化生成新的对象,来避免此问题 。obj2 () {return JSON.parse(JSON.stringify(this.obj))}},watch: {obj2: {handler (newVal, oldVal) {console.log('data变化了')console.log(newVal, oldVal)},deep: true}},
复制代码

全部代码

<template><div><button @click="clickFn">++++</button></div>
</template><script>
export default {name: 'Mall',data () {return {// !监听时给每一个属性都添加getter和setter,变化了,就触发handler函数,如果后期添加属性,这个属性不可以被监听到// obj: {//   a: 10// }// !这种是不可以被监听到的// 因为watch是通过Object.defineProperty()给对象的每一个现有属性增加监听器// 在后面直接添加a属性,身上没有监听器,所以不会被监听到obj: {}}},computed: {// 如果想要得到差异内容,可以结合计算属性、序列化、反序列化生成新的对象,来避免此问题 。obj2 () {return JSON.parse(JSON.stringify(this.obj))}},watch: {obj2: {handler (newVal, oldVal) {console.log('data变化了')console.log(newVal, oldVal)},deep: true}},methods: {clickFn () {// this.obj.a = Math.random()// this.$set(object, key, value)// 使用this.$set就可以监听到this.$set(this.obj, 'a', Math.random())}}
}
</script>

watch监听不到变化?相关推荐

  1. MutationObserver 监听DOM树变化

    1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 ...

  2. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  3. JS实时监听DOM元素变化 - MutationObserver

    使用 MutationObserver API实时监听DOM元素变化 创建 MutationObserver 实列,接受一个用于监听到DOM元素变化的回调函数 const handleListenCh ...

  4. 实时监听输入框值变化的完美方案:oninput onpropertychange

    实时监听输入框值变化的完美方案:oninput & onpropertychange 原文:实时监听输入框值变化的完美方案:oninput & onpropertychange 在 W ...

  5. jquery实时监听输入框值变化

    在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能满足条 ...

  6. [react] React中如何监听state的变化?

    [react] React中如何监听state的变化? 16.x 之前使用componentWillReveiveProps componentWillReceiveProps (nextProps) ...

  7. vue 监听map数组变化_解决vue无法侦听数组及对象属性的变化问题

    一.数组 1.可以监听到的情况 如push.splice.=赋值(array=[1,2,3]) 2.无法监听到的情况 使用下标修改某个元素(这种比较常见) array[index] = 1 objec ...

  8. 父页面监听iframe路由变化_前端路由原理

    对于前端路由应该都很熟悉了,开发过spa应用的应该都用过,只是很少人去查一下前端路由实现的原理. 前端路由的实现核心问题有两个,一个是改变url不刷新,另一个是监听url变化.主要靠的就是hash和h ...

  9. vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题

    vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题 解决方法: 添加路由监听,路由改变时执行监听方法 methods:{fetchData(){console.log('路由发送 ...

  10. onchange监听input值变化及input隐藏后change事件不触发的原因与解决方法(设置readonly后onchange不起作用的解决方案)

    onchange监听input值变化及input隐藏后change事件不触发的原因与解决方法(设置readonly后onchange不起作用的解决方案) 参考文章: (1)onchange监听inpu ...

最新文章

  1. 【高并发】高并发环境下诡异的加锁问题(你加的锁未必安全)
  2. [数据结构] 迷宫问题(栈和队列,深搜和广搜)
  3. 如何创建 Code Snippet
  4. python空元组在all中返回结果详解
  5. centos7中安装JDK8-281版本
  6. 【Linux】一步一步学Linux——ld命令(256)
  7. python 接口 、继承、重载运算符
  8. 《Greenplum5.0 最佳实践》 系统监控与维护 (五)
  9. OSPF的LSA类型 ——连载二网络LSA
  10. 解决XCode运行app在模拟器上,提示模拟器不存在
  11. B站UP主自制的开源OCR翻译器走红Github,用一次就粉了
  12. Mesh平滑处理的几种算法比较
  13. 两波形相位差的计算值_连续模式PFC功率MOSFET电流有效值、平均值计算
  14. 掘金 AMA:听蚂蚁金服高级技术专家-- 章耿谈微服务、架构、日志那些事
  15. 原来没有网络也能扫码支付,都是因为它啊!
  16. AddressBook通讯录右边索引条
  17. LeetCode1153 字符串转化
  18. nltk,wordnet安装时出现问题关于omw-1.4
  19. OLED屏幕的IIC驱动程序
  20. 链传动运动仿真(motion分析)制作包含源文件

热门文章

  1. 算法笔记—02:Java实现排列组合
  2. 某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用
  3. tigase mysql_即时通讯之服务端篇Tigase.
  4. Unity改变物体颜色(添加材质Materials)
  5. 如何加密Android apk
  6. 关于Excel“文件格式和扩展名不匹配。文件可能已损坏或不安全”的解决方法
  7. 目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头
  8. nexus最全使用教程
  9. 补充维生素 你补对了吗
  10. 实战视频教程- RK3399 Android10.0 驱动/内核开发