Vue不能watch数组和对象变化解决方案

Vue 能监听数组的情况

Vue 监听数组和对象的变化(vue2.x)

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

直接 = 赋值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

data () {

  return {

    watchArr: [],

  };

},

watch: {

  watchArr (newVal) {

    console.log('监听:' + newVal);

  }

},

created () {

  setTimeout(() => {

    this.watchArr = [1, 2, 3];

  }, 1000);

},

再如使用 splice(0, 2, 3) 从数组下标 0 删除两个元素,并在下标 0 插入一个元素 3:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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;

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

利用索引直接修改数组值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

data () {

  return {

    watchArr: [{

      name: 'krry',

    }],

  };

},

watch: {

  watchArr (newVal) {

    console.log('监听:' + newVal);

  }

},

created () {

  setTimeout(() => {

    this.watchArr[0].name = 'xiaoyue';

  }, 1000);

},

修改数组的长度

长度大于原数组就将后续元素设置为 undefined

长度小于原数组就将多余元素截掉

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

data () {

  return {

    watchArr: [{

      name: 'krry',

    }],

  };

},

watch: {

  watchArr (newVal) {

    console.log('监听:' + newVal);

  }

},

created () {

  setTimeout(() => {

    this.watchArr.length = 5;

  }, 1000);

},

上面的 watchArr 变成

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 方法可以监听,例子上面有

使用临时变量直接赋值的方式,原理与直接赋值数组一样

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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,只能监听原有属性的变化,不能监听新增、删除的属性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 的方法来设置原有属性

1

2

3

4

this.$set(this.watchObj, 'age', 124);

this.$delete(this.watchObj, 'age')

delete this.watchObj[‘name']//(Vue 无法监听 delete 关键字来删除对象属性)

使用 Object.assign 方法,直接赋值的原理监听(最推荐的方法)

1

2

3

4

this.watchObj = Object.assign({}, this.watchObj, {

  name: 'xiaoyue',

  age: 15,

});

直接 watch obj.key 监听某个值的变化

1

2

3

4

5

watch: {

  'obj.name'(curVal, oldVal) {

    // TODO

  }

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 3中,watch函数可以用于监听响应式对象或者多个普通类型的变化。使用watch函数时,需要传入要监听的目标以及回调函数来处理变化。 例如,在监听响应对象时,可以通过reactive函数创建一个响应式对象,然后使用watch函数来监听该对象变化,并在回调函数中处理新值和旧值。代码示例如下: ```javascript const person = reactive({ name: "柳小刀", age: 18, sex: "男" }); watch(person, (newValue, oldValue) => { console.log(newValue, oldValue); }); ``` 而在监听多个普通类型时,可以使用ref函数创建多个ref对象,并将这些对象作为数组传递给watch函数。在回调函数中,会返回一个包含新值和旧值的数组。 ```javascript const index = ref(0); const inends = ref(0); watch([index, inends], (newValue, oldValue) => { console.log("新值是", newValue, "旧址是", oldValue); //返回的是一个数组 }); ``` 需要注意的是,在Vue 3中,watch函数的使用可能会出现一些报错信息。如果遇到问题,可以参考一些有关解决方案的文章和代码示例来解决。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue3 watch的用法](https://blog.csdn.net/m0_60899441/article/details/126056663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue 中使用 watch 出现了如下的报错的原因分析](https://download.csdn.net/download/weixin_38748210/12942109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinat_40572875

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值