vue动态监听计算对象中的属性

web开发过程中,经常遇到要自动计算的问题,比如输入几个金额,自动计算出总和,或者计算出折扣什么的。还有更复杂的,动态添加删除数组,数组中每个对象都有自动计算的小计,数组外还有总和的计算,那就需要用到computed和watch了。

先来名词解释一下吧!

computed是计算属性,注意是属性,和data属性都是变量,不能重名,用法和data相同。计算属性函数内变量变化,会自动重新计算结果返回。计算属性是基于它们的依赖项的值结果进行缓存的,只要依赖的变量不变, 都直接从缓存取结果。

watch是侦听器,与data中的属性同名,当属性的值发生改变的时候,侦听器被触发执行。一个侦听器对应data中的一个属性,当属性发生变化时触发侦听器的执行。

两者的区别:

1)computed适合用于计算依赖多个属性的情况;watch适合用于计算依赖一个属性的情况

2)computed有return;watch没有

3)watch中有属性变化后的val参数,computed没有参数

4)computed函数内部数据没有变化则直接从缓存中取结果,但数据变化则重新计算,每次计算需要重新创建变量缓存结果;watch则是监听到变化直接计算,不需要创建变量保存结果。所以对于数据多次变化,需要多次计算的情况,computed的开销会更大,更适合使用watch;而数据多次被使用,但其依赖变化较少,获取数据直接从缓存中取,则更适合computed

好了,该说正事了!需求是这样的,新增表单中ruleForm中多个属性,其中一个是可以动态增加和删除的数组ruleForm.specList,数组中装的是对象,如下图。标准价格是是前面选择带出来的数值,数量和销售单价是输入的数值,小计和折扣则是根据前面的数字自动计算出来的。小计=销售单价*数量,折扣=销售价格/标准价格*100。

 然后,这个ruleFrom还有另一个属性,ruleForm.productTotal,如下图,产品合计也是需要自动计算的,是specList中所有小计的和。

 

 其实就是监听ruleForm.specList的数据变化,然后计算结果,更新数据。这里首先不能直接用computed,因为ruleForm是data中的属性,已经不能用在computed中了。也不能直接用watch,因为watch,因为我们是想要监听到ruleForm.specList的数据变化才对数据进行计算。这种情况就可以利用computed做中间层,在computed中定义属性ruleFormSpecList,返回ruleForm.specList,然后在watch中监听ruleFormSpecList,具体代码如下

  computed: {
    ruleFormSpecList(){
      return this.ruleForm.specList
    },
  },
  watch: {
    ruleFormSpecList:{
      handler(){
        let pTotal = Number(0);
        this.ruleForm.specList.forEach(item=>{
          //计算小计
          if (item.sellPrice && item.sellNum){
            this.$set(item, "sellTotal", Number(item.sellPrice * item.sellNum))
          }
          //计算折扣
          if (item.sellPrice && item.basicPrice){
            this.$set(item, "discount", Number((item.sellPrice / item.basicPrice * 100).toFixed(2)))
          }
          //计算产品合计
          if (item.sellTotal){
            pTotal+=Number(item.sellTotal)
          }
        })
        //赋值产品合计
        if (pTotal > 0){
          this.ruleForm.productTotal = pTotal
        }
      },
      //因为要监听对象内部的属性,所以要用deep:true
      deep: true
    }
  },

推荐参考:Vue对象属性值发生变化的监听三种方法_Tand.的博客-CSDN博客_vue监听对象属性值变化

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值