watch和computed是vue框架中很重要的特性。

那么,他们是怎么作用于对象数组的?

今天我们就来探究一下。

上代码。

<template>
<div class="hello">
{{ msg }} <div>
<button @click="submit">plus</button>
</div> <div>{{ testNum }}</div>
</div>
</template> <script> export default {
name: 'abc',
data () {
return {
msg: 'Welcome to Your Vue.js App',
originNum:0,
originObj:[ ] }
}, computed: {
testNum(){
console.log("computed")
if (this.originObj.length === 0) {
this.$set(this.originObj, 0, {number:0})
return this.originObj[0].number
}
let obj = this.originObj[0]
obj.number = -obj.number
this.$set(this.originObj, 0, obj) return this.originObj[0].number
}
},
watch:{
originObj:{
handler: function (val, oldVal) { console.log("watch") },
deep:true
}
},
created(){ },
mounted(){ },
methods:{
submit(){
let obj = this.originObj[0]
obj.number = 100
this.$set(this.originObj, 0, obj)
}
}
};
</script> <style scoped> </style>

首先是初始化(进入这个页面时)。

从日志中可以看到,先调用了computed,再调用了watch。

看代码。数据绑定是绑定了computed:testNum,所以初始化时就会调用。

      if (this.originObj.length === 0) {
this.$set(this.originObj, 0, {number:0})
return this.originObj[0].number
}

因为初始的对象数组originObj没有对象,所以加了一个对象。watch监听到originObj改变了,所以打了日志。

    submit(){
let obj = this.originObj[0]
obj.number = 100
this.$set(this.originObj, 0, obj)
}

然后,我点击按钮,触发submit()方法。

再看日志,分别触发了watch computed watch。

submit()方法修改了this.originObj[0].number,this.originObj的watch加了deep:true,所以可以监听到,watch打进日志。

this.originObj改变了,所以触发了computed:testNum(计算属性computed有缓存,只在值改变时触发),computed打进日志。

computed:testNum触发的时候同时也修改了this.originObj,所以再次触发watch,watch打进日志。

以上。

vue : watch、computed、以及对象数组的更多相关文章

  1. vue学习(十三) 删除对象数组中的某个元素

    //html <div id="app"> //v-for循环就不写了 每一条数据最后都有一个删除的超链 .prevent阻止默认的跳转行为 只执行点击事件 <a ...

  2. vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示

    vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示 https://cn.vuejs.org/v2/guide/class-and-sty ...

  3. vue - for 遍历对象和遍历对象数组

    1. 遍历对象时,参数: 第一个为值,第二个为键名,第三个为索引 <!DOCTYPE html> <html lang="en"> <head> ...

  4. vue的v-for循环普通数组、对象数组、对象、数字

    如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  5. vue 接口 对象数组的传入传出

    数组传入 对象的话用{...obj} <selectFile :tableData="[...tableData]" @uploadSuccess="data =& ...

  6. vue中computed和watch的写法,以及区别

    <template> <div class="print"> <div style="color: red"> <p ...

  7. Vue中computed分析

    Vue中computed分析 在Vue中computed是计算属性,其会根据所依赖的数据动态显示新的计算结果,虽然使用{{}}模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太 ...

  8. [转] vue之computed和watch

    计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...

  9. Vue源码解析之数组变异

    力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...

随机推荐

  1. ASP.NET WebAPI框架解析第一篇

    ASP.NET WebAPI有两种寄宿模式,一种是WebHost,一种是SelfHost,为什么可以有两种模式的原因在于WebAPI有一个相对独立的消息处理管道,只要给这个消息管道传递一个封装好的对象 ...

  2. Java解析apk、ipa图标,包名,应用名称,版本号

    参看:http://blog.csdn.net/moyanxuan_1993_2_24/article/details/53612001

  3. 5、struct2的获得jsp参数的第三种方式

    在前面已经讲解了通过在action中直接通过jsp的参数和ModelDiver的方式获得浏览器传递的参数,下面我们介绍第三种方式,也是在项目开发中推荐的方式 action不需要在实现ModelDriv ...

  4. mysql性能优化总结(MySql避免重复插入记录的几种方法)

    如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...

  5. 内存节省机制C演示

    编写代码实质是通过指令对计算机内存进行操作,计算机的硬件设备往往十分有限,尤其是内存.如何使有限的存储空间利用效率达到最大,成为了代码优化首先要考虑的事情. 比如,输入三个数比较大小并输出最小值.下面 ...

  6. Python 偏函数用法全方位解析

    Python的functools模块中有一种函数叫“偏函数”,自从接触它以来,发现确实是一个很有用且简单的函数,相信你看完这篇文章,你也有相见恨晚的感觉. 我们都知道,函数入参可以设置默认值来简化函数 ...

  7. SQL注入之Union注入攻击

    union联合查询算是最简单的一种注入了,但是却是经常遇到. 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列 ...

  8. linux环境搭建单机kafka

    准备工作: jdk-8u191-linux-x64.rpm  |   zookeeper-3.4.6.tar.gz  |   kafka_2.11-2.2.0.tgz 对应的地址 zookeeper: ...

  9. 报错Connection refused: connect

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_34266804/article/d ...

  10. Chrome插件Postman的数据目录存储位置,记一次重装系统后找回postman数据的过程...

    有次重装系统到一块新的SSD磁盘,很多数据都做了备份就是忘记将Chrome插件Postman的数据做备份,导致重装后找不到以前定义的那些Collections.悔恨之余想到既然我原来的C盘还在,为何不 ...