Vue不能watch数组和对象变化解决方案
作者:Krryblog 发布时间:2024-04-30 10:41:06
Vue 能监听数组的情况
Vue 监听数组和对象的变化(vue2.x)
vue 实际上可以监听数组变化,比如:
直接 = 赋值
data () {
return {
watchArr: [],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
this.watchArr = [1, 2, 3];
}, 1000);
},
再如使用 splice(0, 2, 3) 从数组下标 0 删除两个元素,并在下标 0 插入一个元素 3:
data () {
return {
watchArr: [1, 2, 3],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
this.watchArr.splice(0, 2, 3);
}, 1000);
},
push、unshift、pop 数组也能够监听到
Vue 无法监听数组变化
但是,数组在下面两种情况无法监听:
利用索引直接设置一个数组项时,例如:arr[indexOfItem] = newValue;
修改数组的长度时,例如:arr.length = newLength;
举例无法监听数组变化的情况
利用索引直接修改数组值
data () {
return {
watchArr: [{
name: 'krry',
}],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
this.watchArr[0].name = 'xiaoyue';
}, 1000);
},
修改数组的长度
长度大于原数组就将后续元素设置为 undefined
长度小于原数组就将多余元素截掉
data () {
return {
watchArr: [{
name: 'krry',
}],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
this.watchArr.length = 5;
}, 1000);
},
上面的 watchArr 变成
Vue 无法监听数组变化的解决方案
this.$set(arr, index, newVal);
data () {
return {
watchArr: [{
name: 'krry',
}],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
this.$set(this.watchArr, 0, {name: 'xiaoyue'});
}, 1000);
},
使用数组 splice 方法可以监听,例子上面有
使用临时变量直接赋值的方式,原理与直接赋值数组一样
data () {
return {
watchArr: [{
name: 'krry',
}],
};
},
watch: {
watchArr (newVal) {
console.log('监听:' + newVal);
}
},
created () {
setTimeout(() => {
let temp = [...this.watchArr];
temp[0] = {
name: 'xiaoyue',
};
this.watchArr = temp;
}, 1000);
},
Vue 监听对象
Vue 可以监听直接赋值的对象
this.watchObj = {name: 'popo'};
但是 Vue 不能 直接 监听对象属性的添加、修改、删除
Vue 设置监听对象
使用this.$set(object, key, value)、this.$delete(object, key)
使用深度监听 deep: true,只能监听原有属性的变化,不能监听新增、删除的属性
mounted () {
// 这里使用深度监听 blog 对象的属性变化,会触发 getCatalog 方法
this.$watch('blog', this.getCatalog, {
deep: true
// immediate: true // 是否第一次触发
});
},
watch: {
obj: {
// 这里深度监听变化,直接触发下面方法
handler(curVal, oldVal) {
// TODO
},
deep: true,
immediate: true // 是否第一次触发
}
}
使用this.$set(obj, key, val)来新增属性,this.$delete(object, key)来删除属性
无法使用 this.$set 监听修改原有属性;可以使用深度监听 deep: true,可以直接以 obj.key 的方法来设置原有属性
this.$set(this.watchObj, 'age', 124);
this.$delete(this.watchObj, 'age')
delete this.watchObj[‘name']//(Vue 无法监听 delete 关键字来删除对象属性)
使用 Object.assign 方法,直接赋值的原理监听(最推荐的方法)
this.watchObj = Object.assign({}, this.watchObj, {
name: 'xiaoyue',
age: 15,
});
直接 watch obj.key 监听某个值的变化
watch: {
'obj.name'(curVal, oldVal) {
// TODO
}
}
来源:https://ainyi.com/51


猜你喜欢
- django台后默认上传文件名在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileFiel
- 登陆万事开头难,做什么事都要有个起点,后面才能更好的进行下去,因此我选择的起点就是最为直观的登陆页面 /login/index.vue/sr
- MacJi “偷懒”翻译了部分,下午冒着被 BOSS 开除的危险将其补完(原文链接)。使用 line-height 垂直居中line-hei
- 一.基本数据类型整数:int字符串:str(注:\t等于一个tab键)布尔值: bool列表:list (元素的集合)列表用[]元祖:tup
- pymysql 是 python 用来操作MySQL的第三方库,下面具体介绍和使用该库的基本方法。1.建立数据库连接通过 connect 函
- 判断是否xx开始使用startswith示例代码:String = "12345 上山打老虎"if str(String
- 我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。比如我们要下载山东大学新闻网的一个页面,该网页如下:实
- 本文实例为大家分享了js实现上传文件功能的具体代码,供大家参考,具体内容如下一、用input完成上传,效果图如 &nb
- pytorch加载图片数据集有两种方法。1.ImageFolder 适合于分类数据集,并且每一个类别的图片在同一个文件夹, ImageFol
- 一 Consul介绍Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用
- 代码如下:<html> <head> &nb
- 如下所示:self.findChild(QComboBox, "name") self is classfirst pa
- 一、圆周率的历史1、中国魏晋时期,刘徽曾用使正多边形的边数逐渐增加去逼近圆周的方法 (即「割圆术」),求得π的近似值3.1416。汉朝时,张
- 以channel Attention Block为例子class CAB(nn.Module):def __init__(self, in_
- 利用python+ffmpeg合并B站视频及格式转换 B站客户端下载的视频一般有两种格式:早期的多为blv格式(由flv格式转换而来,音视频
- Vue3新属性:CSS 中的 v-bind()写在前面:本文主要介绍Vue3中的新增的v-bind()的常用使用方式,主要包括在css,le
- 从wind上面搞到一批股票数据后发现:本来是一个类型的数据,但是由于季度不同,列名也不同,导致使用pandas合并多个报表的时候总是出现一大
- 大家都知道,linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(
- 本文实例讲述了Python实现向QQ群成员自动发邮件的方法。分享给大家供大家参考。具体实现方法如下:原理:我们需要先获取QQ群中的所有成员并
- watch的作用:监听vue实例上数据的变动示例:queryData: {name: '',creator: '