原文地址:关于 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. 利用索引直接设置一个数组项时,例如:arr[indexOfItem] = 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
    长度小于原数组就将多余元素截掉

    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,
    });
    },
  1. 使用 this.set(obj, key, val) 来新增属性(vue 无法监听 this.set 修改原有属性)

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

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

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

    this.watchObj = Object.assign({}, this.watchObj, {
    name: 'xiaoyue',
    age: 15,
    });

原文地址:

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

关于 vue 不能 watch 数组变化 和 对象变化的解决方案的更多相关文章

  1. vue 不能检测数组长度 值变化原因解析

    1.vue不能检测数组长度或者值的变化 (1)数组长度变化 未检测到 <!DOCTYPE html> <html lang="en"> <head&g ...

  2. vue中改变数组的值视图无变化

    今天开发的时候遇到一个多选取消点击状态的,渲染的时候先默认都选中,然后可以取消选中,自建了一个全为true的数组,点击时对应下标的arr[index]改为false,数据改变了状态没更新,突然想起来单 ...

  3. 在vue中使用watch监听对象或数组

    最近发现在vue中使用watch监听对象或者数组时,当数组或者对象只是单一的值改变时,并不会出发watch中的事件. 在找问题过程中,发现当数组使用push一类的方法时,会触发watch,如果只是单一 ...

  4. vue数组更新界面无变化

    1. vue数组更新界面无变化 1.1. 说明 对数组进行更新或者添加,一定要注意方式,我的情况是数组套数组,双重循环,在造数据的时候,不断从尾部添加数据,所以写成了如下形式,每次下拉都会去加载一批相 ...

  5. vue 绑定class、v-bind:style(对象语法、数组语法)

    绑定 HTML Class 我们可以传给 v-bind:class 一个对象,以动态地切换 class: 内联样式在模板里 <div id="div1" :class=&qu ...

  6. vue : watch、computed、以及对象数组

    watch和computed是vue框架中很重要的特性. 那么,他们是怎么作用于对象数组的? 今天我们就来探究一下. 上代码. <template> <div class=" ...

  7. vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...

  8. vue 快速入门 系列 —— 侦测数据的变化 - [vue 源码分析]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue ...

  9. vue 快速入门 系列 —— 侦测数据的变化 - [vue api 原理]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue api 原理] 前面(侦测数据的变化 - [基本实现])我们已经介绍了新增属性无法被侦测到,以及通过 delete 删除数据也不会 ...

随机推荐

  1. mac搭建简单的hls推流服务器遇到的问题(待更新)

    实际操作步骤: 输入brew install nginx-full --with-rtmp-module命令出现以下报错: 需要先安装nginx服务器,运行命令brew tap homebrew/ng ...

  2. P2V后,VMWare ESX 上RedHat AS5网络不通问题的解决办法

    现象: 机器在启动eth0后,可以ping通eth0的IP,但是很快就无法访问了. 原因: red hat 5.x 默认系统安装完成后为xen内核,那么xen内核引导启动后就会有虚拟网卡(vethx. ...

  3. Docker-Compose入门

    转:https://blog.csdn.net/chinrui/article/details/79155688

  4. [微信小程序]在应用地图时,如何设置满屏(高度)

    微信小程序在做地图功能时 用常规的办法height:100%:来设置高度来占满屏幕是不行的 它不会生效 应该改用单位vh 例如 height:100vh 这样就可以是地图占满整个屏幕高度

  5. 电子科技大学第九届ACM趣味程序设计竞赛(热身赛)题解

    比赛地址:http://acm.uestc.edu.cn/#/contest/show/191 A题 小羽涂色 题意: 在x轴的正半轴上,问你是否存在一段区间[L,R]其中包含r个奇数和g个偶数. 分 ...

  6. Java作业 十一(2017-11-13)

    /*关键字*/ package com.baidu.www; abstract class A { private String name; public A(String name) { this. ...

  7. [Swift]LeetCode75. 颜色分类 | Sort Colors

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  8. Linux 实现服务器之间时间同步

    在主服务器上安装NTP时间同步服务器 yum -y install ntp vim /etc/ntp.conf  手动添加两行 server 127.127.1.0 fudge 127.127.1.0 ...

  9. MySQL优化之my.conf配置详解

    最近项目不太忙,所以有时间静心来研究下mysql的优化,对于MySQL的设置是否合理优化,直接影响到网站的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识, ...

  10. Java9发布回顾Java 8的十大新特性

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...