当前位置: 首页 > news >正文

Vue3学习(组合式API——Watch侦听器详解)

目录

一、Watch侦听器。

(1)侦听单个数据。

(2)侦听多个数据。(数组写法?!)

(3)immediate参数。(立即执行回调)

(3)deep参数。(深层监视)

使用deep开启深度侦听监视。(不仅监听对象的地址,还会监听对象的所有子属性变化)

(4)精确侦听对象(ref、reactive)的某个属性。(固定写法的简单回调:()=>xx对象)


一、Watch侦听器。

  • 官方解释:在组合式 API 中,使用 watch 函数在每次响应式状态发生变化时触发回调函数
  • 基本作用:侦听一个或者多个数据的变化,数据变化时执行回调函数。其中有两个额外的参数:immediate(立即执行)、deep(深度侦听)。
(1)侦听单个数据。
  • 基本语法:watch(ref对象,(newValue,oldValue)=>{ ... })
  • 代码示例。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app">{{count}}<button @click="changeCount">count+1</button></div><script type="module">import { createApp, ref, watch } from './vue.esm-browser.js'createApp({setup() {const count = ref(0)const changeCount = () => {count.value++;}watch(count, (newValue, oldValue) => {console.log('新值:' + newValue)console.log('旧值:' + oldValue)})return {count,changeCount}}}).mount('#app')</script></body></html>

  • 效果。

(2)侦听多个数据。(数组写法?!)
  • 基本语法:watch([ref对象1,ref对象2...],(newArr,oldArr)=>{ ... })
  • 代码示例。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app">{{count}}<button @click="changeCount">count+1</button>{{nickname}}<button @click="changeNickname">改昵称</button></div><script type="module">import { createApp, ref, watch } from './vue.esm-browser.js'createApp({setup() {const count = ref(0)const nickname = ref('张三')const changeCount = () => {count.value++;}const changeNickname = () => {nickname.value = '李四'}/* //监听单个数据watch(count, (newValue, oldValue) => {console.log('新值:' + newValue)console.log('旧值:' + oldValue)}) *///监听多个数据watch([count, nickname], (newArr, oldArr) => {console.log('新数组:' + newArr)console.log('旧数组:' + oldArr)})return {count,nickname,changeCount,changeNickname}}}).mount('#app')</script></body></html>

  • 效果。

(3)immediate参数。(立即执行回调)
  • 基本说明:在侦听器创建时——立即触发回调,响应式数据变化之后继续执行回调
  • 代码示例。(一进页面里面执行回调!)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app">{{count}}<button @click="changeCount">count+1</button></div><script type="module">import { createApp, ref, watch } from './vue.esm-browser.js'createApp({setup() {const count = ref(0)const changeCount = () => {count.value++;}//immediate,立即执行回调watch(count, (newValue, oldValue) => {console.log('新值:' + newValue)console.log('旧值:' + oldValue)}, {immediate: true})return {count,changeCount,}}}).mount('#app')</script></body></html>

  • 效果。

(3)deep参数。(深层监视)
  • 基本说明:其中默认的watch进行浅层监视(如:const ref1 = ref(简单类型),可以直接监视)。默认的watch对于“const ref2 = ref(复杂类型)”,监视不到其内部数据的变化!
  • deep:true。开启监视侦听内部数据的变化



  • 这种情况只有修改userInfo整个.value,修改了对象的地址才能侦听监视到。因为默认是浅层的。



  • 使用deep开启深度侦听监视。(不仅监听对象的地址,还会监听对象的所有子属性变化)
  • 代码示例。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app">{{count}}<button @click="changeCount">count+1</button><div>----------------------------------------------------</div>{{userInfo}}<button @click="changeUserInfo">修改userInfo</button></div><script type="module">import { createApp, ref, watch } from './vue.esm-browser.js'createApp({setup() {const count = ref(0)const userInfo = ref({name: 'zs',age: '18'})const changeCount = () => {count.value++;}const changeUserInfo = () => {userInfo.value.age++;}//浅层侦听watch(userInfo, (newValue) => {console.log(newValue)},{deep: true})return {count,userInfo,changeCount,changeUserInfo}}}).mount('#app')</script></body></html>

  • 效果。

(4)精确侦听对象(ref、reactive)的某个属性。(固定写法的简单回调:()=>xx对象)
  • 基本说明:在不开启deep参数的前提下,侦听某个对象的某个属性的变化,且只有该值发生变化时才执行回调
  • 代码示例。(ref创建的对象、reactive创建的对象
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="app">{{userInfo}}<button @click="changeUserInfo">修改userInfo</button><div>----------------------------------------------------</div>{{userInfo2}}<button @click="changeUserInfo2">修改userInfo2</button></div><script type="module">import { createApp, ref, watch, reactive } from './vue.esm-browser.js'createApp({setup() {const userInfo = ref({name: 'zs',age: '18'})const userInfo2 = reactive({name: 'ls',age: '30'})const changeUserInfo = () => {userInfo.value.age++;}const changeUserInfo2 = () => {userInfo2.name = 'wu'}//watch侦听watch(() => userInfo.value.age, (newValue, oldValue) => {console.log('新' + newValue)console.log('旧' + oldValue)})watch(() => userInfo2.name, (newValue, oldValue) => {console.log('新' + newValue)console.log('旧' + oldValue)})return {userInfo,userInfo2,changeUserInfo,changeUserInfo2}}}).mount('#app')</script></body></html>

  • 效果。

相关文章:

  • TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
  • 【愚公系列】《Manus极简入门》038-数字孪生设计师:“虚实映射师”
  • elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
  • 02_Servlet
  • Python模块引用
  • 鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp
  • NSSCTF [HNCTF 2022 WEEK4]
  • CS4334立体声D/A转换器:为高品质音频设计提供低成本的解决方案
  • Vue 和 React 状态管理的性能优化策略对比
  • C#高级编程:IO和序列化
  • 【SSL部署与优化​】​​HTTP/2与HTTPS的协同效应
  • OkHttp连接池
  • Spring集成Redis中禁用主机名DNS检测
  • springboot AOP 接口限流(基于IP的接口限流和黑白名单)
  • 在Oracle到GreatSQL迁移中排序规则改变引发的乱码问题分析及解决
  • MySQL--day1--数据库概述
  • 洞若观火 - 服务网格的可观测性魔法 (Istio 实例)
  • 基于 Spring Boot 瑞吉外卖系统开发(十五)
  • STC32G12K12实战:串口通信
  • Vector和list
  • 押井守在30年前创造的虚拟世界何以比当下更超前?
  • 《歌手2025》公布首发阵容,第一期就要淘汰一人
  • 第十二届警博会在京开幕:12个国家和地区835家企业参展
  • 马上评|“为偶像正名”的正确做法是什么
  • 马上评丨岂能为流量拿自己的生命开玩笑
  • Manus向全球用户开放注册