vue : watch、computed、以及对象数组
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、以及对象数组的更多相关文章
- vue学习(十三) 删除对象数组中的某个元素
//html <div id="app"> //v-for循环就不写了 每一条数据最后都有一个删除的超链 .prevent阻止默认的跳转行为 只执行点击事件 <a ...
- vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示
vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示 https://cn.vuejs.org/v2/guide/class-and-sty ...
- vue - for 遍历对象和遍历对象数组
1. 遍历对象时,参数: 第一个为值,第二个为键名,第三个为索引 <!DOCTYPE html> <html lang="en"> <head> ...
- vue的v-for循环普通数组、对象数组、对象、数字
如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- vue 接口 对象数组的传入传出
数组传入 对象的话用{...obj} <selectFile :tableData="[...tableData]" @uploadSuccess="data =& ...
- vue中computed和watch的写法,以及区别
<template> <div class="print"> <div style="color: red"> <p ...
- Vue中computed分析
Vue中computed分析 在Vue中computed是计算属性,其会根据所依赖的数据动态显示新的计算结果,虽然使用{{}}模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太 ...
- [转] vue之computed和watch
计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...
- Vue源码解析之数组变异
力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...
随机推荐
- spring cloud config 配置文件更新
Spring Cloud Config Server 作为配置中心服务端 拉取配置时更新 git 仓库副本,保证是最新结果 支持数据结构丰富,yml, json, properties 等 配合 eu ...
- python fabric安装
1 安装epel wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2 安装pip yum i ...
- HTML&CSS面试高频考点(三)
11. CSS隐藏元素的方式 /*占据空间,无法点击*/ visibility: hidden; position: relative; top: -999em; /* 不占据空间,无法点击 */ p ...
- Python实用笔记 (17)模块
一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块. 现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲 ...
- Java使用IO流读取TXT文件
通过BufferedReader读取TXT文件window系统默认的编码是GBK,而IDE的编码多数为UTF-8,如果没有规定new InputStreamReader(new FileInputSt ...
- C# 做的Windows 应用程序 服务
运行服务: ,cmd下进入目录 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\ ,安装服务 installutil F:\中原集团\天津CCHR\t ...
- JavaScript基础对象创建模式之单体/单例模式(Singleton)
首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...
- 前端日常工作中常用开发小技巧 ---JavaScript
1.格式化金钱值 const ThousandNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "," ...
- 第一章 java基本多线程技能
第一章 java多线程技能 1 线程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理顺序时发生的活动:是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位. ...
- 数据解析_bs进行数据解析
1.bs4进行数据解析 数据解析的原理 1.标签定位 2.提取标签,标签属性中存储的数据值 bs4数据解析的原理 1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中 2.通 ...