Vue中的计算属性和监听属性

Vue中的计算属性和监听属性

在项目中难免会遇到计算属性和监听属性,这两个都可以 监听数据的变化,但是又有些不同,在这里总结一下

一、computed计算属性

当需要监听一些数据需要随着其它数据变动而变动时,通常更好的做法是使用计算属性

1. 使用插值表达式获取计算属性的值

<template>
   <div>
    <Form :model="info" label-position="right" :label-width="100" class="sales-center-form">
      <FormItem label="单价">
        <Input v-model="info.单价"/>
      </FormItem>
      <FormItem label="数量">
        <Input v-model="info.数量"/>
      </FormItem>
      <FormItem label="总价">
        //第一种用法,使用插值表达式获取计算属性的值
        {{ totalMoney }}
      </FormItem>
    </Form>
  </div>
</template>
<script>
  export default{
    data(){
      return {
        info: {
          '单价': 5,
          '数量': 8
        }
      } 
    },
    computed: {
      totalMoney(){
        var _that = this;
        var total = 0;
        total = _that.info.单价 * _that.info.数量;
        return total;
      }
    }
  }
</script>

2. 使用v-model双向绑定数据

<template>
  <div>
    <Form :model="info" label-position="right" :label-width="100" class="sales-center-form">
      //...
      <FormItem label="总价">
        //第二种用法,使用v-model双向绑定数据
        <Input v-model="sumMoney"/>
      </FormItem>
    </From>
  </div>
</template>
<script>
  export default{
    data(){
      return {
        info: {
          '单价': 5,
          '数量': 8
        }
      } 
    },
    computed: {
      sumMoney:{
        get(){ // 计算属性默认只有 getter,如果想要修改sumMoney时添加一个setter 
          var _that = this;
          var total = 0;
          total = _that.info.单价 * _that.info.数量;
          return total;
        },
        set(newValue){
          var _that = this;
          _that.info.单价 = 6;
          _that.info.数量 = newVlue / _that.info.单价; 
        }
      }
    }
  }
</script>

二、watch监听属性

1. 监听对象的属性

<template>
   <div>
    <Form :model="info" label-position="right" :label-width="100" class="sales-center-form">
      <FormItem label="书名">
        <Input v-model="info.书名"/>
      </FormItem>
      <FormItem label="作者">
        <Input v-model="info.作者"/>
      </FormItem>
      <FormItem label="推荐语">
        <Input v-model="text"/>
      </FormItem>
    </Form>
  </div>
</template>
<script>
export default{
  data(){
    return {
      info: {
        '书名': '阿弥陀佛,么么哒',
        '作者': '大冰'
      },
      text: '善良是一种天性,善意是一种选择。阿弥陀佛么么哒,是一句祝福,一份善意'
    }
  },
  watch: { //watch监听info的属性,只要info中任意属性改变,text就会清空
    info: {
      deep: true, //在监听对象的属性时,必须添加deep:true,进行深度监听
      handler(){
        var _that = this;
        _that.text = '';
      }
    }
  }
}
</script>

2. 监听数组中对象的属性

监听数组中对象的属性,使用deep:true,已经不管用啦。在这里就需要借助this.$set了。

<template>
  <div>
    <Table border stripe :columns="columns" :data="detail"></Table>
    <Input v-model="text"/>
  </div>
</template>
<script>
  export default{
    data(){
      return {
        columns: [
          {
            title: '书名',
            key: '书名',
            render: (h,params) => {
              return h('Input',{
                props: {
                  value: params.row.书名
                },
                on:{
                  'on-blur': (el) => {
                    var _that = this;
                    params.row.书名 = el.target.value;
                    _that.detail[params.index] = params.row;
                    _that.$set(_that.detail,params,params.row); //使用this.$set深度监听数组中对象的属性
                  }
                }
              },params.row.书名)
            }
          },
          {
            title: '作者',
            key: '作者',
            render: (h,params) => {
              return h('Input',{
                props: {
                  value: params.row.作者
                },
                on:{
                  'on-blur': (el) => {
                    var _that = this;
                    params.row.作者 = el.target.value;
                    _that.detail[params.index] = params.row;
                    _that.$set(_that.detail,params,params.row);
                  }
                }
              },params.row.作者)
            }
          }
        ],
        detail: [
          {
            '书名': '阿弥陀佛,么么哒',
            '作者': '大冰'
          }
        ],
        text: '善良是一种天性,善意是一种选择。阿弥陀佛么么哒,是一句祝福,一份善意'
      }
    },
    watch: {
      detail: {
        deep: true,
        handler(){
          var _that = this;
          _that.text = ''
        }
      }
    }
  }
</script>
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值