Vue3 watch 监视属性
- 作用:监视数据的变化(和
Vue2
中的watch
作用一致) - 特点:
Vue3
中的watch
只能监视以下四种数据:
ref
定义的数据。reactive
定义的数据。- 函数返回一个值(
getter
函数)。- 一个包含上述内容的数组。
我们在Vue3
中使用watch
的时候,通常会遇到以下几种情况:
ref定义的基本类型
<template><div class="person"><h2>当前求和{{ sum }}</h2><button @click="changeAddOne">点击加一</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let sum = ref(0);// 方法
function changeAddOne() {sum.value++;
}// 监视 watch(谁,回调函数)
watch(sum, (newValue, oldValue) => {console.log('sum发生变化了', newValue, oldValue);
});
</script>
watch监视里面的ref数据不需要.value
。
主动停止监视:
<template><div class="person"><h2>当前求和{{ sum }}</h2><button @click="changeAddOne">点击加一</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let sum = ref(0);// 方法
function changeAddOne() {sum.value++;
}// 监视 watch(谁,回调函数)
const stopWatch = watch(sum, (newValue, oldValue) => {console.log('sum发生变化了', newValue, oldValue);if(newValue >= 10) {stopWatch();}
});
</script>
ref定义的对象数据
监视ref
定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视。
注意:
- 若修改的是
ref
定义的对象中的属性,newValue
和oldValue
都是新值,因为它们是同一个对象。- 若修改整个
ref
定义的对象,newValue
是新值,oldValue
是旧值,因为不是同一个对象了。
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let person = ref({name: '张三',age: 18
});
// 方法
function changeAge() {person.value.age++;
}// 监视 watch(谁,回调函数)
// 监视的是对象的地址值,若想监视对象内部的属性,需要手动开启深度监视 - deep: true
watch(person, (newVal, oldVal) => {console.log('watch:', newVal, oldVal);
}, {deep: true, immediate: true});
</script>
watch的参数:
- 第一个参数:被监视的数据
- 第二个参数:监视的回调
- 第三个监视:配置对象(deep, imediate)
reactive定义的对象数据
reactive默认监视开启深度监视。
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18
});
// 方法
function changeAge() {person.age++;
}// 监视 watch(谁,回调函数)
// 默认开始深度监视
watch(person, (newVal, oldVal) => {console.log('watch:', newVal, oldVal);
}, {immediate: true});
</script>
监视ref/reactive定义的对象类型中某一个属性
监视ref
或reactive
定义的【对象类型】数据中的某个属性,注意点如下:
- 若该属性值不是【对象类型】,需要写成函数形式。
- 若该属性值是依然是【对象类型】,可直接编,也可写成函数,建议写成函数。
结论:监视的要是对象里的属性,那么最好写函数式,注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视。
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视
watch(() => {return person.age
}, (newVal, oldVal) => {console.log('age:', newVal, oldVal);
});
</script>
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视
watch(() => {return person.car
}, (newVal, oldVal) => {console.log('car:', newVal, oldVal);
}, {deep:true});
</script>
多个数据?
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视
watch(() => {return [person.car, person.age]
}, (newVal, oldVal) => {console.log('car:', newVal, oldVal);
}, {deep:true});
</script>
相关文章:
Vue3 watch 监视属性
作用:监视数据的变化(和Vue2中的watch作用一致)特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。reactive定义的数据。函数返回一个值(getter函数)。一个包含上述内容的数组。 我们在V…...

大数据-158 Apache Kylin 安装配置详解 集群模式启动
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

PHP商会招商项目系统一站式服务助力企业腾飞
商会招商项目系统——一站式服务,助力企业腾飞 🚀💼 🚀 开篇:企业成长的加速器,商会招商项目系统来袭 在竞争激烈的市场环境中,企业如何快速找到适合自己的发展路径,实现腾飞&…...
pnpm 和 npm
pnpm 和 npm 是 JavaScript 生态系统中常用的包管理工具,它们各自有不同的特性和优缺点。下面是这两者的详细比较: 1. 基本概念 npm (Node Package Manager): 是 Node.js 的默认包管理器,提供安装、更新、卸载 JavaScript 包的功…...

笔试算法总结
文章目录 题目1题目2题目3题目4 题目1 使用 StringBuilder 模拟栈的行为,通过判断相邻2个字符是否相同,如果相同就进行删除 public class Main {public static String fun(String s) {if (s null || s.length() < 1) return s;StringBuilder builde…...

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互
在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候需要手动设置类型处理器才可以,这里记录一下类型处理器的设置 /*** UUID类型处理器*/ public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获…...

vue3 高德地图标注(飞线,呼吸点)效果
装下这两个 npm 忘了具体命令了,百度一下就行 “loca”: “^1.0.1”, “amap/amap-jsapi-loader”: “^1.0.1”, <template><div id"map" style"width: 100%;height: 100%;"></div> </template><script setup> …...

程序员成长秘籍:是迈向管理巅峰,还是深耕技术架构?
专业在线打字练习平台-巧手打字通,只输出有价值的知识。 一 管理和架构 做技术的同学一般有两条职业发展路径,横向的管理路线和纵向的技术路线。管理路线对应的是管理岗,讲究的是排兵布阵,通过各种资源的优化配置发挥价值。技术路…...
xargs的参数及常用命令
1. xargs 命令简介 xargs 是一个非常有用的工具,它用于从标准输入(stdin)构建和执行命令行。xargs 可以将标准输入中以空格或换行符分隔的数据,转化为命令的参数传递给其他命令。 使用场景: 当某些命令不支持使用管…...
FLASK 数据库建立以及部署和表的创建
首先安装flask-sqlalchemy db SQLAlchemy(app) 一 Mmeber、User模型类的创建 # coding: utf-8 from app import db, appclass Member(db.Model):__tablename__ memberid db.Column(db.Integer, primary_keyTrue)membername db.Column(db.String(100), uniqueTrue, index…...
微信小程序的面试题
简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch() 区别 ? wx.navigateTo() : 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面 wx.redirectTo() : 关闭当前页面,跳转到应用内的…...
udp c语言实现组播的例子
一、组播与广播的区别 1、组播地址和广播地址是不同的概念 组播地址:用于将数据包发送到一组特定的接收者,只有加入该组播地址的设备才能接收数据。它提高了网络效率,因为发送者只需发送一份数据。 广播地址:用于将数据包发送到…...
ffmpeg面向对象——AVInputFormat与URLProtocol啥关系
《ffmpeg面向对象-rtsp拉流相关对象》和《ffmpeg面向对象——拉流协议匹配机制探索》探索过了输入格式匹配和底层协议匹配,且ffmpeg拉流是先是匹配输入格式——抽象为AVInputFormat类,然后再匹配url协议类——抽象为URLProtocol类。 它们是啥关系&#…...

【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!二叉搜索树 大家好,这里是店小二!今天我们将深入探讨高阶数据结构中的AVL树。AVL树是一种自平衡的二叉搜索树,可以看作是对传统二叉搜索树的优化版本。如果你对数据结…...

中级软考软件设计师真题+模拟题+课件讲解+机考讲解模拟+笔记分享
软考真题分享 下载链接⬇️⬇️: 下载链接...

MySQL—视图
前言: 视图是一个虚拟的表,是基于一个或多个基本表或其他视图的查询结果集。视图本身不占据物理储存空间,仅仅只是一个查询的逻辑表示,物理上依赖于数据表的数据。 视图具有简单,安全,逻辑数据独立&#…...

鸿蒙OS启动流程
启动流程(基于openharmony4.1) 系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动: 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后,会挂载tmpfs,…...

服务器数据恢复—EMC存储RAID5磁盘阵列数据恢复案例
服务器数据恢复环境: 一台EMC某型号存储设备,该存储中有一组由12块(包括2块热备盘)STAT硬盘组建的raid5阵列。 服务器故障: 该存储在运行过程中突然崩溃,raid瘫痪。数据恢复工程师到达现场对故障存储设备进…...
使用 `netcat`(nc)工具进行TCP数据发送和接收
Netcat(通常缩写为nc)是一个功能强大的网络工具,常被称为“瑞士军刀”的网络工具。它用于在网络上进行各种操作,比如读写网络连接、调试和分析网络服务等。以下是关于Netcat的一些详细介绍: ### 主要功能 1. **TCP/U…...
Linux虚拟化技术嬗变综述
在信息技术飞速发展的今天,虚拟化技术已经成为数据中心、云计算和企业IT基础设施中不可或缺的一部分。Linux操作系统作为开源和灵活的代表,在虚拟化技术的发展中扮演了重要角色。本文将综述Linux虚拟化技术的演变,探讨其优势、应用场景&#…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...