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打进日志。

以上。

原文地址:https://www.cnblogs.com/foxcharon/p/10241580.html

时间: 2024-08-29 12:56:50

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

关于json数组对象和对象数组遇到的一些问题

###json数组对象和对象数组一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如"北京"这个单独的词. 第二种类型是sequence(序列),也就是若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如"浙江,江苏". 第三种类型是mapping(映射),也就是一个名/值对(Name/value),即数据有一

vue之computed和watch

计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed,通过别人改变自己 watch,通过自己改变别人 需要注意的是,computed会缓存数据,只有在满足以下两个条件时才会重新计算: 1.存在依赖型数据,即存在于VUE的data等对象的实下的实例数据 2.依赖型数据发生改变 如果不满足以上两个条件,computed不会重新计算,只会拿缓存的数据.而w

Vue中的混入对象mixins

Vue中的混入对象mixins mixins的定义 混入是分发vue组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项,当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 选项合并规则 当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合: 同名钩子函数将会被混合为一个数组,因此都会被调用(组合) 混入对象的钩子将在组件自身钩子函数之前调用(调用顺序) 数据对象data在内部会进行浅合并(一层属性深度),在和组件的数据发生冲突时以组件数据优先 两个对象键名冲突时

集合框架(对象数组的概述和使用)

package cn.itcast_01; public class Student { // 成员变量 private String name; private int age; // 构造方法 public Student() {  super(); } public Student(String name, int age) {  super();  this.name = name;  this.age = age; } // 成员方法 // getXxx()/setXxx() publ

spring接收对象数组实例

JS var param= new Array(); var one= new Object; one.id = '1'; one.name= 'simba1'; param.push(one); var two= new Object; two.id = '2'; two.name= 'simba2'; param.push(two); $.ajax({ async : false, cache : false, type : 'POST', dataType:"json", con

java 对象数组

数组是引用类型,而类同样是引用类型,所以如果是对象数组的话表示一个引用类型里面嵌套其他引用类型. 在前面两篇都是属于基本数据类型的数据,但是索引的引用数据类型也同样可以定义数组,这样的数组称为对象数组. 以类为例定义对象数组: 动态初始化:   //开辟之后对象数组的内容都是默认值,即null值 类名称 对象数组名称 [ ]  = new 类名称 [长度] : 分步完成: 声明对象数组: 类名称 对象数组名称 [ ]  = null ; 开辟对象数组:对象数组名称 = new 类名称 [长度]

对象数组

---------------siwuxie095 对象数组 对于程序来说,实例化对象非常重要,只有先实例化对象,才能通过 这个对象访问相关的数据成员和成员函数 但是在很多场合下,一个对象是远远不够用的,往往需要一组对象 「某些情况下需要一组对象」 如:想表示一个班的学生,假如这个班的学生一共有 50 人,如果还 使用简单的对象实例化,就要定义 50 个变量来表示这 50 个学生 显然,这样做是很愚蠢的,需要通过数组来表达这一个班的学生 再如:如果需要定义一个坐标,一个坐标只能代表一个点,如果要

ajax传递数组、form表单提交对象数组

在JSP页面开发中,我们常常会用到form表单做数据提交,由于以前一直只是使用form表单提交单个对象,只要表单文本域的name值和接收的对象的属性名一致,那么传值就没有什么问题.不过,在前几天的开发任务中,遇到了需要批量传递对象,也就是需要传递对象数组,在此做个总结.今天又遇到需要向后台传递数组,便一并写下来吧. 1.ajax传递普通数组 前台代码 var deleteNum= [];//定义要传递的数组 deleteNum.push("1"); deleteNum.push(&qu

new对象数组时的内存布局

[cpp] view plain copy #include <iostream> #include <limits> using namespace std; #define SAFE_DELETE(x) \ { \ if (NULL != (x)) \ { \ delete (x); \ (x) = NULL; \ } \ } #define SAFE_DELETE_ARY(x) \ { \ if (NULL != (x)) \ { \ delete[] (x); \ (x)