监听器watch

本文介绍了Vue中如何使用监听器监听响应式数据,包括ref和reactive的使用,如何监听对象属性,以及如何设置深层监听和立即监听。通过watch方法,可以在数据变化时执行相应操作,如打印新值或执行其他逻辑。同时,文章展示了在数据未改变时通过immediate参数实现初始化监听的情况。

监听器用于监听响应式数据。当响应式数据发生了改变可以进行相应的操作。

监听ref

下面代码作用:当每次num的值改变时就打印一下新的值

<template>
  <div id="d">
    num
    <button @click="num++">{{num}}</button>
  </div>
</template>

<script setup>
import {ref,reactive, watch} from 'vue'
const num=ref(0);
const obj=reactive({});

watch(num,(newX)=>{
  console.log('新的值为',newX);
})
</script>
<style></style>

监听reactive对象

不能直接监听响应式对象的属性值

const obj = reactive({ count: 0 })
// 错误,因为 watch() 得到的参数是一个 number
watch(obj.count, (count) => {
  console.log(`count is: ${count}`)
})

要用一个返回该属性的getter函数

// 提供一个 getter 函数
watch(
  () => obj.count,
  (count) => {
    console.log(`count is: ${count}`)
  }
)

深层监听

当给watch传入一个响应式对象,会自动创建一个深层的监听器,对象内所有的属性发生改变都会触发回调函数。

<template>
  <div id="d">
    <button @click="obj.count++">{{obj.count}}</button>
    <!-- 数值发生改变也会触发 -->
  </div>
</template>

<script setup>
import {ref,reactive, watch} from 'vue'
const obj = reactive({ count: 0,name: '' })
watch(obj, (newValue,oldValue) => {
  console.log(newValue,oldValue)
})
obj.name='jack'; //名字发生改变会触发
</script>
<style></style>

obj里面的属性发生了改变都会触发watch监听器。

当obj.name改变时触发了watch,这时打印newValue和oldValue,这两个是一样的,他们都是obj对象。

其实我们也可以手动的把watch变为深层监听,加多一个deep

watch(value,()=>{
    
},{deep:true})

立即监听

上面监听器只有在数据发生改变时才会监听,但有时候我们希望在一开始就监听数据的变化,执行某些操作。这时可以加上immediate:true实现立即监听,即页面一被渲染就开始监听。

<template>
  <div id="d">
    <button @click="obj.count++">{{obj.count}}</button>
  </div>
</template>

<script setup>
import {ref,reactive, watch} from 'vue'
const obj = reactive({ count: 0,name: '' })
watch(obj, (newValue,oldValue) => {
  console.log(newValue,oldValue)
},{immediate:true}) //立即监听
</script>
<style></style>

现在我没有改变数据,但是页面渲染完后就实现了监听。

newValue为obj对象,oldValue是undefined.

}) //立即监听


现在我没有改变数据,但是页面渲染完后就实现了监听。

newValue为obj对象,oldValue是undefined.

![](https://img-blog.csdnimg.cn/img_convert/0d91b9a52d62553e49cd475764dcd44c.png)
### Vue3 中 `watch` 监听器的使用方法 #### 一、基本概念 在 Vue3 中,`watch` 是用于侦听响应式数据变化并执行相应操作的强大工具。当被监听的数据发生变化时,会触发回调函数来处理这些变化[^1]。 #### 二、不同类型的监听方式 ##### 方式1:监视 ref 定义的基本数据类型 对于通过 `ref()` 创建的基础数据类型变量,可以直接利用 `watch` 进行监控: ```javascript import { ref, watch } from 'vue'; const count = ref(0); watch(count, (newVal, oldVal) => { console.log(`count changed from ${oldVal} to ${newVal}`); }); ``` ##### 方式2:监视 ref 定义的对象类型 如果想要监听由 `ref()` 构建的对象内部属性的变化,则需设置深度监听模式: ```javascript import { ref, watch } from 'vue'; const obj = ref({ name: 'Alice', age: 25 }); // 开启深度监听 watch(obj, () => { console.log('obj has been modified'); }, { deep: true }); ``` ##### 方式3:监视 reactive 定义的对象类型数据 针对采用 `reactive()` 函数创建的对象结构,同样可以运用 `watch` 实现对其成员变量变动情况的关注: ```javascript import { reactive, watch } from 'vue'; const state = reactive({ message: '', }); watch(() => state.message, (newValue, oldValue) => { console.log(`message updated from "${oldValue}" to "${newValue}"`); }); ``` ##### 方式4:监视特定对象属性 有时仅关心某个具体字段而非整个对象的状态转变,此时可通过箭头函数指定目标路径完成精准捕捉: ```javascript import { reactive, watch } from 'vue'; const user = reactive({ profile: { firstName: 'John', lastName: 'Doe' } }); watch( () => user.profile.firstName, (newValue, oldValue) => { console.log(`firstName changed from ${oldValue} to ${newValue}`); } ); ``` 以上展示了四种常见的 `watch` 应用场景及其对应的实现代码片段[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值