Vue3 计算属性和侦听器

计算属性computed函数

computed函数调用时, 要接收一个处理函数, 处理函数中, 需要返回计算属性的值

<template>
  <div>我今年的年纪 <input type="text" v-model="age" /></div>
  <div>我明年的年龄 {{ nextAge }}</div>
  <div>我后年的年龄 <input type="text" v-model="nextAge2" /></div>
</template>

<script setup>
import { computed, ref } from 'vue'
const age = ref(10)
// 不带set的计算属性
const nextAge = computed(() => {
  return +age.value + 1
})

// 带set的计算属性
const nextAge2 = computed({
  get() {
    return +age.value + 2
  },
  set(value) {
    age.value = value - 2
  },
})

// 计算属性可以传参吗? 答案是可以 
<div>任意年龄 {{ nextAge3(100) }}</div>

const nextAge3 = computed(() => {
  return val => {
    return val + Number(age.value)
  }
})
</script>

计算属性例子

<h1>{{message}}</h1>
<p> {{testMethod}}</p>
<p >{{testMethod()}}</p>
<p >{{testMethod()}}</p>
<p >{{testComputed}}</p>
<p >{{testComputed}}</p>
<p >{{testComputed2(1, 2)}}</p>
<p >{{testComputed2(1, 2)}}</p>
<p >{{testComputed2(3, 4)}}</p>

<script setup>
message: '我是data数据'

computed: {
  testComputed() {
    console.log('计算属性');
    return this.message + '现在我用的是computed'
  },
  testComputed2() {
      console.log(1111);
      // 计算属性也是可以传参的, 也是有缓存的 - 上面打印111只有一次
      return function(a, b) {
        return a + b
      }
    }
},

testMethod() {
  console.log('方法');
    return this.message + '现在我用的是methods'
}
<script>

侦听器watch函数

watch监视, 接收三个参数
1. 参数1: 监视的数据源
2. 参数2: 回调函数
3. 参数3: 额外的配置 -- 常用配置:立即执行,深度监听
// 监听单个ref
const money = ref(100)
watch(money, (value, oldValue) => {
  console.log(value)
})

// 监听多个ref
const money = ref(100)
const count = ref(0)
watch([money, count], (value) => {
  console.log(value)
})
watch([money, count], ([v1,v2]) => {
  console.log(v1,v2)
})
watch([money, count], ([v1,v2], [prevV1, prevV2]) => {
  console.log(v1,v2,prevV1, prevV2)
})

// 监听ref复杂数据 -- 如果是reactive就不用deep,侦听器会自动启用深层模式
const user = ref({
  name: 'zs',
  age: 18,
})
watch(
  user,
  (value) => {
    console.log('user变化了', value)
  },
  {
    // 深度监听,,,当ref的值是一个复杂数据类型,需要深度监听
    deep: true,
    immediate: true
  }
)

// 监听对象的某个属性的变化
const user = ref({
  name: 'zs',
  age: 18,
})
watch(
  () => user.value.name,
  (value) => {
    console.log(value)
  }
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值