vue中watch监听不到变化的解决
作者:尤雨溪不懂VUE 发布时间:2024-04-30 10:41:33
标签:vue,watch,监听
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>
来源:https://juejin.cn/post/7182777720672256060


猜你喜欢
- js中自动清除ie缓存方法 — 常用 对于动态文件,比如 index.asp?id=... 或者 index.aspx?id=... 相信有
- 这段时间常给来面试的同学用《 你是一个职业的页面重构工作者吗? 》中三个部分的不同阶段去做自测,发现很多人都自我感觉良好,给我的回答基本都是
- python中ftplib模块支持ftp操作,主要使用FTP类。本文使用ftp操作进行连接FTP服务器、获取当前目录文件清单、上传文件等操作
- 在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的;同时在WAMP(Windows、Apache、MyS
- 本文实例讲述了python使用webbrowser浏览指定url的方法。分享给大家供大家参考。具体如下:这段代码提示用户输入关键词,通过we
- 作为开发者,我们可以通过以下3中方式来配置logging:1)使用Python代码显式的创建loggers, handlers和format
- (一).确认删除用法: 1. BtnDel.Attributes.Add("onclick","return
- 本文讲述了Symfony核心类。分享给大家供大家参考,具体如下:Symfony的核心类Symfony的MVC方式使用了一些你以后会经常碰到的
- 枚举是常用的功能,看看Python的枚举.from enum import EnumMonth = Enum('Month'
- 1. MySQL如何使用索引索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关
- 目录简介使用介绍实际体验小结简介MySQL 作为最流行的开源数据库,在各个领域都有相当广泛的应用,作为一个 MySQL DBA,经常会对数据
- 前言在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的。因此,为了使统计得到的结果更方便查看需要进行排序。Py
- 分支的新建与合并现在让我们来看一个简单的分支与合并的例子,实际工作中大体也会用到这样的工作流程:开发某个网站。为实现某个新的需求,创建一个分
- 1.Null数据的处理 1)检索出null值  
- 本文实例讲述了Python编程对列表中字典元素进行排序的方法。分享给大家供大家参考,具体如下:内容目录:1. 问题起源2. 对列表中的字典元
- Python算法的分类对葡萄酒数据集进行测试,由于数据集是多分类且数据的样本分布不平衡,所以直接对数据测试,效果不理想。所以使用SMOTE过
- //TransmitFile实现下载protected void Button1_Click(object sender, EventArg
- 本文实例讲述了python实现图片变亮或者变暗的方法。分享给大家供大家参考。具体实现方法如下:import Image# open an i
- 本文介绍了使用xmlhttp处理远程文件数据、或采集文章时,对对方网页编码的处理方法。因为使用ajax的xmlhttp网页编码处理不当很容易
- 在查询中执行下列语句 EXEC sp_attach_single_file_db @dbname = 'tggov_Data'