相关文章推荐
阳刚的键盘  ·  联网 | uni-app·  2 月前    · 
温文尔雅的罐头  ·  联网 | uni-app x·  2 月前    · 
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区·  1 月前    · 
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_ ...·  1 月前    · 
从容的饭卡  ·  JSON—ArcGIS Velocity | 文档·  1 月前    · 
聪明伶俐的柠檬  ·  被巨头盯上的云自习,究竟是不是一门好生意?_ ...·  1 年前    · 
贪玩的野马  ·  【涨球技】赫亚坐莲是怎样练成的·  1 年前    · 
气宇轩昂的红薯  ·  《蛋仔派对》糖心公主皮肤兑换码_蛋仔派对_九 ...·  2 年前    · 
傻傻的凳子  ·  2020西班牙恐怖片《马拉萨尼亚32号鬼宅》 ...·  2 年前    · 
爱跑步的豆芽  ·  来天门山的第一件事儿,竟然是和蜘蛛人一起“捡 ...·  2 年前    · 
Code  ›  关于 vue 不能 watch 数组变化 和 对象变化的解决方案开发者社区
vue 解决方案 数组 对象数组
https://cloud.tencent.com/developer/article/1353039
帅气的毛衣
1 年前
Krry
0 篇文章

关于 vue 不能 watch 数组变化 和 对象变化的解决方案

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Krry
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > Krryblog > 关于 vue 不能 watch 数组变化 和 对象变化的解决方案

关于 vue 不能 watch 数组变化 和 对象变化的解决方案

作者头像
Krry
修改 于 2019-03-01 17:40:48
6.3K 0
修改 于 2019-03-01 17:40:48
举报

博客地址: 关于 vue 不能 watch 数组变化 和 对象变化的解决方案

vue 监听数组和对象的变化

vue 监听数组

vue 实际上可以监听数组变化,比如:

data () {
  return {
    watchArr: [],
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],
watchArr (newVal) {
  console.log('监听:' + newVal);
created () {
  setTimeout(() => {
    this.watchArr.splice(0, 2, 3);
  }, 1000);
},

push 数组也能够监听到

vue 无法监听数组变化的情况

但是,数组在下面两种情况无法监听:

  1. 利用索引直接设置一个数组项时,例如:arrindexOfItem = newValue;
  2. 修改数组的长度时,例如:arr.length = newLength;

举例无法监听数组变化的情况

  1. 利用索引直接修改数组值
data () {
  return {
    watchArr: [{
      name: 'krry',
watchArr (newVal) {
  console.log('监听:' + newVal);
created () {
  setTimeout(() => {
    this.watchArr[0].name = 'xiaoyue';
  }, 1000);
},
  1. 修改数组的长度 长度大于原数组就将后续元素设置为 undefined 长度小于原数组就将多余元素截掉undefined
data () {
  return {
    watchArr: [{
      name: 'krry',
watchArr (newVal) {
  console.log('监听:' + newVal);
created () {
  setTimeout(() => {
    this.watchArr.length = 5;
  }, 1000);
},

上面的 watchArr 变成

vue 无法监听数组变化的解决方案

  1. this.$set(arr, index, newVal);
data () {
  return {
    watchArr: [{
      name: 'krry',
watchArr (newVal) {
  console.log('监听:' + newVal);
created () {
  setTimeout(() => {
    this.$set(this.watchArr, 0, {name: 'xiaoyue'});
  }, 1000);
},
  1. 使用数组 splice 方法可以监听,例子上面有
  2. 使用临时变量直接赋值的方式,原理与直接赋值数组一样
data () {
  return {
    watchArr: [{
      name: 'krry',
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 监听对象的解决方法

  1. 使用 this.$set(object, key, value)
  2. 使用深度监听 deep: true,只能监听原有属性的变化,不能监听增加的属性
mounted () {
  // 这里使用深度监听 blog 对象的属性变化,会触发 getCatalog 方法
  this.$watch('blog', this.getCatalog, {
    deep: true,
 
推荐文章
阳刚的键盘  ·  联网 | uni-app
2 月前
温文尔雅的罐头  ·  联网 | uni-app x
2 月前
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区
1 月前
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_element-china-area-data 前端json数组怎么转换成字符串传到后端
1 月前
从容的饭卡  ·  JSON—ArcGIS Velocity | 文档
1 月前
聪明伶俐的柠檬  ·  被巨头盯上的云自习,究竟是不是一门好生意?_澎湃号·湃客_澎湃新闻-The Paper
1 年前
贪玩的野马  ·  【涨球技】赫亚坐莲是怎样练成的
1 年前
气宇轩昂的红薯  ·  《蛋仔派对》糖心公主皮肤兑换码_蛋仔派对_九游手机游戏
2 年前
傻傻的凳子  ·  2020西班牙恐怖片《马拉萨尼亚32号鬼宅》预告_哔哩哔哩_bilibili
2 年前
爱跑步的豆芽  ·  来天门山的第一件事儿,竟然是和蜘蛛人一起“捡垃圾”?_腾讯新闻
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号