计算属性和侦听属性(computed和watch)

计算属性和侦听属性(computed和watch)

计算属性的应用(computed计算属性方法区)

1、描述:表达式太复杂的情况会导致组件模板难以维护,而且多个地方使用到相同的表达式会导致重

<template>
  <div>
    <!--表达式太复杂的情况会导致组件模板难以维护,而且多个地方使用到相同的表达式会导致重复-->
    <div>
      <!--type和msg的拼接表达式-->
      {{type + ":" +msg}};
    </div>
    <!--使用计算属性解决这类问题-->
    <div>{{type_msg}}</div>
  </div>
</template>
<script>
  export default {
    data () {
      return {
        type:"demo",
        msg:"news",
      }
    },
    /*计算属性方法区*/
    computed:{
      type_msg(){
        return this.type + ":" +this.msg;
      }
    },
    methods: {

    }
  }
</script>

2、也可以通过函数方式到达计算属性的效果(不推荐)

<!--使用函数达到计算属性的效果-->
    <div>{{getTypeMsgFunc()}}</div>
methods: {
      getTypeMsgFunc(){
        return this.type + ":" +this.msg;
      }
    }

> 小结:为什么不推荐使用函数的方式达到computed计算属性的效果呢,原因是computed就算属性是具有dom缓存功能的,当数据方式变化时,计算属性会依据dom缓存中的数据来进行计算更新,反之数据无变化则不会重复计算。函数的方式实现则是无论数据是否发生改变都会重复的调用函数,性能低,故不推荐使用函数方式实现。

3、计算属性方法中的get和set方法
其中get方法用于获取计算属性return的值,set方法用来修改计算属性的值

<template>
  <div>
    <!--表达式太复杂的情况会导致组件模板难以维护,而且多个地方使用到相同的表达式会导致重复-->
    <div>
      <!--type和msg的拼接表达式-->
      {{type + ":" +msg}};
    </div>
    <!--使用计算属性解决这类问题-->
    <div>{{type_msg}}</div>
    <!--使用函数达到计算属性的效果-->
    <div>{{getTypeMsgFunc()}}</div>
    <button @click="modifyTypeMsg()">修改typeMsg</button>
  </div>
</template>
computed:{
      /*type_msg(){
        return this.type + ":" +this.msg;
      }*/
      type_msg:{
        get () {
          return this.type + ":" +this.msg;
        },
        set (newTypeMsg) {
          let arr = newTypeMsg.split(" ");
          this.type = arr[0];
          this.msg = arr[1]
        }
      }
    },
methods: {
      getTypeMsgFunc(){
        return this.type + ":" +this.msg;
      },
      //在改方法修改变量值后,可以在计算属性方法中通过set方法进行计算获取新的值
      modifyTypeMsg(){
        this.type_msg = "Rich Brian"
      }
    }

侦听属性的应用(watch监听)

watch可以监听到data里面的数据变化,即监听到下列中的type或者msg发生变化时,执行一个什么样的函数(该场景下不推荐使用,用computed计算属性可以实现)

<button @click="modifyType()">修改type</button>
    <button @click="modifyMsg()">修改Msg</button>
modifyType(){
        this.type = "时间"
      },
      modifyMsg(){
        this.msg = "2021年"
      }
watch:{
      //watch可以监听到data里面的数据变化
      //即监听到type或者msg发生变化时,执行一个什么样的函数
      type(newVal){
        this.type_msg = newVal + ":" + this.msg
      },
      msg(newVal){
        this.type_msg = this.type + ":" + newVal
      }
    }

小结:
computed使用场景:某个数据受多个数据影响(类似于拼接),或者需要对其他数据进行js处理后在显示的情况
watch使用场景:一个数据的变化会影响多个数据或者一个数据的变化需要执行异步操作

watc监听的使用场景示例:

    <div>语言:{{language}}</div>
    <button @click="switchLang('ch')">中文</button>
    <button @click="switchLang('en')">English</button>
    <div>{{zhangsan}}</div>
    <div>{{lisi}}</div>
data () {
      return {
        language:'cn',
        zhangsan:'张三',
        lisi:'李四',
      }
    },
switchLang(val){
        this.language = val;
      }
watch:{
      language(newVal){
        if (newVal==='ch'){
          this.zhangsan =  "张三"
          this.lisi  = "李四"
        }else if (newVal === 'en'){
          this.zhangsan = 'zhangsan'
          this.lisi = 'lisi'
        }
      },
      immediate:true, //immediate为true时立刻执行
    }

即上列中的语言中英文变量的切换会影响到zhangsan和lisi多个变量的变化,故采用watch监听来进行修改较为推荐
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值