vue3 中 wacth监听函数

以下代码同样也是在setup语法糖中的写法

watch接收三个参数,

  • 一个想要侦听的响应式引用或 getter 函数
  • 一个回调
  • 可选的配置选项

(1)使用watch监听ref的数据

<template>
    <p>我是新的首页</p>
    <button @click="change">改变num1的值</button>
</template>

<script lang="ts" setup>
import { onMounted,watch,ref,reactive } from 'vue';

const num1=ref<number>(0)
const change=()=>{
    num1.value++
}
watch(num1,(newV,old)=>{
    console.log(newV,old);
})
</script>

<style scoped></style>

(2)使用ref监听多个响应式数据,第一个参数就是一个数组

<template>
    <p>我是新的首页</p>
    <button @click="change">改变值</button>
</template>

<script lang="ts" setup>
import { onMounted,watch,ref,reactive } from 'vue';

const num1=ref<number>(0)
const num2=ref<number>(0)
const change=()=>{
    num1.value++
    num2.value++
}
watch([num1,num2],(newV,old)=>{
    console.log(newV,old);
})
</script>

<style scoped></style>

(3)使用watch监听reactive的响应式数据,这里有很多需要注意的地方
* 如果直接监听整个数据的改变,则old无法获取正确的值,同时deep深度监听是无效的,默认开启无法关闭

<template>
    <p>我是新的首页</p>
    <button @click="change">改变值</button>
</template>

<script lang="ts" setup>
import { onMounted,watch,ref,reactive } from 'vue';

interface Person{
    age:number;
}

const person=reactive<Person>({
    age:10
})

const change=()=>{
    person.age++
}

//监听整个person
watch(person,(newV,old)=>{
    console.log('person变化了',newV,old);
    
},{
    deep:false
})
</script>

<style scoped></style>

打印结果:

  • 监听reactive响应式数据中的某个属性,old是可以正确获取的,deep同样也是默认开启无法关闭的,注意监听某个属性watch的第一个参数写法改变了,是一个函数
<template>
    <p>我是新的首页</p>
    <button @click="change">改变值</button>
</template>

<script lang="ts" setup>
import { onMounted,watch,ref,reactive } from 'vue';

interface Person{
    age:number;
}

const person=reactive<Person>({
    age:10
})

const change=()=>{
    person.age++
}

watch(()=>person.age,(newV,old)=>{
    console.log('person变化了',newV,old);
    
},{
    deep:false
})
</script>

<style scoped></style>

打印结果:

  • 使用wacth监听reactive的多个属性,同样第一个参数就是数组
<template>
    <p>我是新的首页</p>
    <button @click="change">改变值</button>
</template>

<script lang="ts" setup>
import { onMounted,watch,ref,reactive } from 'vue';

interface Person{
    age:number;
    name:string
}

const person=reactive<Person>({
    age:10,
    name:'张三'
})

const change=()=>{
    person.age++
    person.name+="~"
}

watch([()=>person.age,()=>person.name],(newV,old)=>{
    console.log('person变化了',newV,old);
    
},{
    deep:false
})
</script>

<style scoped></style>

打印结果:

第三个可配置的选项就是深度监听deep和立即执行immediate

watch(num,(newValue,old)=>{
    console.log(newValue);
},{
    deep:true,
    immediate:true
})
posted @ 2022-01-14 17:31  最爱宋人头  阅读(423)  评论(0编辑  收藏  举报