Vue中的监视属性watch和计算属性computed

1.watch

watch监听的是已经在data中定义的变量,当该值发生变化时,会触发watch中监听该属性的方法。

//基本语法:
watch:{
   attr(newVal, oldVal) {
        xxxxx
    }
}

简单写法示例:


<template>
  <div id="app">
    <h1>真的吗?--->{{isTruth ? '真的': '假的'}}</h1>
    <button @click="changetruth">切换真假</button>
  </div>
</template>

<script>

export default {
  data() {
      return {
        isTruth:true
      }
  },
  methods:{
    changetruth() {
      //改变isTruth的值
      this.isTruth = !this.isTruth
    }
  },
  watch: {
    //监视isTruth值的变化
    isTruth(newVal, oldVal) {
      console.log(`isTruth从${oldVal}被修改成${newVal}了`)
    }
  }
}
</script>

点击按钮后:isTruth由true变为false

 

初始化时监视一次:immediate:true

watch: {
    //监视isTruth值的变化
    isTruth: {
      immediate:true,
      handler(newVal, oldVal) {
        console.log(`isTruth从${oldVal}被修改成${newVal}了`)
      }
    }
  }

 不用点击按钮操作,立即执行一次监视方法

深度监视:deep:true,针对于引用类型的数据

<template>
  <div id="app">
    <p>a的值是:{{numbers.a}}</p>
    <button @click="numbers.a++">让a+1</button>
    <p>d的值是:{{numbers.c.d}}</p>
    <button @click="numbers.c.d++">让d+1</button>
  </div>
</template>

<script>

export default {
  data() {
      return {
        numbers:{
          a:1,
          b:1,
          c: {
            d:100
          }
        }
      }
  },
  watch: {
    numbers:{
      handler(newVal) {
        console.log('numbers发生变化了')
        console.log(newVal)
      }
    }
  }
}
</script>

上述代码没有加上deep属性,默认为false,对象的属性值发生变化时,watch并没有去监测到变化,现在把deep加上

watch: {
    numbers:{
      deep: true,
      handler(newVal) {
        console.log('numbers发生变化了')
        console.log(newVal)
      }
    }
  }

 2.computed

计算属性在data对象中不存在,定义的这个值依赖于其他值,当所依赖的值发生变化时或者变量发生变化,计算属性也会跟着变化,计算属性最终也会出现在vm中,直接可以读取使用即可,底层也是借助了Object.defindProperty()提供的getter和setter

computed的简化写法:

<template>
  <div id="app">
     姓:<input type="text" v-model="lastName" />
     名:<input type="text" v-model="firstName" />
    全名:<span>{{fullName}}</span>
  </div>
</template>

<script>

export default {
  data() {
      return {
        firstName:'三',
        lastName:'张'
      }
  },
  computed: {
    fullName() {
      return this.lastName + '-' + this.firstName
    }
  }
}
</script>

使用get()、set()方法完成属性计算:

<template>
  <div id="app">
     姓:<input type="text" v-model="lastName" />
     名:<input type="text" v-model="firstName" />
     <br />
     修改全名:<input type="text" v-model="fullName" />
    全名:<span>{{fullName}}</span>
  </div>
</template>

<script>

export default {
  data() {
      return {
        firstName:'三',
        lastName:'张'
      }
  },
  computed: {
    fullName: {
      //get在初次读取fullName和依赖的值发生变化时触发
      get() {
        console.log('get被调用')
        return this.lastName + '-' + this.firstName
      },
      //set在fullName改变的时候被调用
      set(value) {
          console.log('set', value)
          const name = value.split('-')
          this.lastName = name[0]
          this.firstName = name[1]
      }
    }
  }
}
</script>

 

监视属性和计算属性的区别:

1.值本身是否存在:computed要计算的属性本身不存在,但是依赖于其他值;watch要监视的属性已经在data中定义,当该值发生变化时,会触发监视对象中的handler方法

2.是否有返回值:computed最终要返回一个值供给外部使用,而watch不需要返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值