Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器
1、computed() 计算属性
在模板中绑定表达式只能用于简单的运算。如果运算比较复杂,可以使用 Vue.js 提供的计算属性,通过计算属性可以处理比较复杂的逻辑。
1.1 计算属性的应用
通过计算属性可以实现各种复杂的逻辑,包括运算、函数调用等,只要最后返回一个计算结果就可以。当计算属性依赖的数据发生变化时,计算属性的值会自动更新,所有依赖该计算属性的数据绑定也会同步进行更新。
【实例】使用 computed 计算属性,实现每个单词首字母大写。
<template><p>原字符串:{{ data }}</p><p>新字符串:{{ newData }}</p>
</template><script setup>
//导入函数
import { ref, computed } from 'vue';//创建一个响应式代理对象
const data = ref('my heart will go on');//计算方法:实现首字母大写
const newData = computed(() => {let arr = data.value.split(' '); //注意:使用响应式对象的.value属性,获取内部值for (let i = 0; i < arr.length; i++) {arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substr(1).toLowerCase();}return arr.join(' ');
});</script>
执行结果:

2.2 计算属性的 getter 和 setter
每一个计算属性都包含一个 getter 和一个 setter。getter 只要用来读取值,而 setter 主要用来设置值。getter 主要用来读取值,而 setter 主要用来设置值。当手动更新计算属性的值时,就会触发 setter,执行一些自定义的操作。
【实例】使用 计算属性的 getter 和 setter,重新设置人物姓名。
<template><p>人物名称:{{ person.fullname }}</p>
</template><script setup>
//导入函数
import { reactive, computed } from 'vue';//创建一个响应式代理对象
const person = reactive({firstName: 'Jim',lastName: 'Carrey'
});// 计算属性 - 简写
// person.fullName = computed(() => {
// return `${person.firstName} ${person.lastName}`
// })//计算属性的 getter 和 setter
person.fullname = computed({get() {return `${person.firstName} ${person.lastName}`},set(value) {const arr = value.split(' ');person.firstName = arr[0]person.lastName = arr[1]}
});//重新设置人物名称
person.fullname = 'Will Smith';</script>
执行结果:

1.3 methods 与 computed 的区别
问:Vue 中的 methods 方法与 computed 计算属性有什么区别?
答:主要区别是 methods 方法会实时计算,而 computed 计算属性是使用缓存数据。
将相同的操作定义为一个方法,或者定义为一个计算属性,两种方式的结果完全相同。那么为什么还需要计算属性呢?因为计算属性是基于它们的依赖进行缓存的。当页面重新渲染时,如果依赖的数据未发生改变,使用计算属性获取的值就是一直是缓存值。只有依赖的数据发生改变时才会重新获取值。如果使用的是方法,在页面重新渲染时,方法中的函数总会被重新调用。
详情请浏览本博客的文章:《Vue中的methods方法与computed计算属性的区别》
2、watch() 监听器
watch() 方法相当于 Vue 根实例选项对象中的 watch 选项。该方法用于监听特定的数据,并在回调函数中应用。当被监听的数据发生变化时,才会调用回调函数。
2.1 监听 ref 响应式对象
watch() 方法可以接收两个参数。如果使用该方法监听的是一个 ref 对象,那么第一个参数需要监听的 ref 对象,第二个参数是当监听的数据发生变化时触发的回调函数。
【实例】使用 watch() 方法监听一个 ref 响应式对象,实现“米”和“厘米”单元的换算结果。
<template>请输入米数:<input type="text" size="6" v-model="data" /><p>换算结果:{{ result }}</p>
</template><script setup>
//导入函数
import { ref, watch } from 'vue';//创建一个 ref 响应式代理对象
const data = ref(0);//换算结果变量
const result = ref('');//watch监听器
watch(data, (newValue, oldValue) => {console.log("新值", newValue);console.log("旧值", oldValue);result.value = `${data.value} 米 = ${data.value * 100} 厘米`;
});</script>
执行结果:

2.2 监听 reactive 响应式对象
如果 watch() 方法监听的是一个 reactive 对象中的某个属性,那么第一个参数需要使用返回该属性的函数的方式。
watch() 方法的两个额外参数:
1、immediate:是否立即执行。
2、deep:是否深度监听。
注意:
如果要监听的属性值是一个对象,要想监听对象内部值的变化,需要在监听属性的选项参数中设置 deep 选项的值为 true(开启深度监听)。
【实例2】使用 watch() 方法监听一个 reactive 响应式对象中的某个属性,输出属性的原值和新值。
<template><p>商品名称:{{ product.name }}</p><p>{{ product.remark }}</p>
</template><script setup>
//导入函数
import { reactive, watch } from 'vue';//创建一个 reactive 响应式代理对象
const product = reactive({name: '华为手机',price: 6999,remark: ''
});//watch监听器
watch(() => product.price, (newValue, oldValue) => {product.remark = `原价格:${oldValue}元,新价格:${newValue}元`;
},//两个额外参数(非必填){immediate: false, //关闭:立即监听;默认关闭deep: true //开启:深度监听;如果监听对象是 reactive() 响应式对象,则默认自动开启});//修改属性值
product.price = 3999;</script>
执行结果:

2.3 监听多个属性
监听属性通常用来实现数据之间的换算,如长度单位之间的换算、速度单位之间的换算、汇率之间的换算等。
【实例】使用 watch() 方法监听多个属性,实现速度单位之间的换算。
<template><p><label for="meter">米/秒:</label><input id="meter" type="number" v-model="meter"></p><p><label for="kilometer">千米/小时:</label><input id="kilometer" type="number" v-model="kilometer"></p>{{ meter }}米/秒={{ kilometer }}千米/小时
</template><script setup>
//导入函数
import { ref, watch } from 'vue';//创建两个 ref 响应式代理对象
const meter = ref(0);
const kilometer = ref(0);//watch监听器:监听多个属性
watch([meter, kilometer],([newMeter, newKilometer], [oldMeter, oldKilometer]) => {if (newMeter != oldMeter) {kilometer.value = newMeter * 3600 / 1000;}if (newKilometer != oldKilometer) {meter.value = newKilometer * 1000 / 3600;}}
);</script>
执行结果:

3、watchEffect() 高级监听器
3.1 watchEffect() 的使用
watchEffect() 方法用来监听数据的变化,类似于 Vue 2.x 中的 watch 选项。该方法接收一个函数作为参数,它会立即执行一次,同时会跟踪函数里面用到的所有响应式状态,当状态发生变化时会重新运行该函数。
【实例】使用 watchEffect() 方法监听数据,实现“米”和“厘米”单元的换算结果。
<template>请输入米数:<input type="text" size="6" v-model="data" /><p>换算结果:{{ result }}</p>
</template><script setup>
//导入函数
import { ref, watchEffect } from 'vue';//创建一个 ref 响应式代理对象
const data = ref(0);//换算结果变量
const result = ref('');//watch监听器
watchEffect(() => {result.value = `${data.value} 米 = ${data.value * 100} 厘米`;
});</script>
执行结果:

3.2 watch 和 watchEffect 的区别
watch 和 watchEffect 是 Vue 3.0 中新增的两个响应式 API,用于监听数据的变化。watch 适用于需要获取新值和旧值,或者需要懒执行的场景,而 watchEffect 适用于需要监听多个数据源,并且需要立即执行的场景。它们之间的区别如下:
- watch 是监听单个数据源,可以设置 immediate 和 deep 选项,可以获取新值和旧值;watchEffect 则是监听一组数据源,不能设置 immediate 和 deep 选项,不能获取新值和旧值。
- watch 是懒执行的,只有在数据变化时才会执行回调函数,而 watchEffect 则是立即执行的,不管数据是否变化。
- watch 可以监听计算属性,而 watchEffect 不能监听计算属性。
相关文章:
Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器
1、computed() 计算属性 在模板中绑定表达式只能用于简单的运算。如果运算比较复杂,可以使用 Vue.js 提供的计算属性,通过计算属性可以处理比较复杂的逻辑。 1.1 计算属性的应用 通过计算属性可以实现各种复杂的逻辑,包括运算、函数调用等…...
RAII 与 std::lock_guard 在 C++ 中的应用:自动化互斥锁管理与线程安全
目录 1. RAII(资源获取即初始化)概述 RAII 的优点 2. std::lock_guard 的工作原理 2.1 构造函数 2.2 析构函数 2.3 关键特性 3. 为什么 std::lock_guard 能自动管理锁的生命周期 3.1 RAII 原则的应用 3.2 异常安全 3.3 简化代码和减少错误 4.…...
风格汇:奢华风格在UI设计中如何被定义的。
在UI设计中,奢华风格通常指的是一种高端、豪华、精致的设计风格,旨在营造出奢华、豪华的视觉效果,给用户带来高品质、高档次的感受。 奢华风格的UI设计通常会运用一些富丽堂皇的元素和效果,例如金色、银色、贵族紫、华丽的字体、华…...
Vue2 qrcode+html2canvas 实现二维码的生成和保存
1.安装 npm install qrcode npm install html2canvas 2.引用 import QRCode from qrcode import html2canvas from html2canvas 效果: 1. 二维码生成: 下载二维码图片: 二维码的内容: 实现代码: <template>…...
GEE 教程:利用Google Dynamic数据进行逐月指定区域的土地分类数据提取分析
目录 简介 数据 代码 结果 简介 利用Google Dynamic数据进行逐月指定区域的土地分类数据提取分析 数据 Google Dynamic数据是指由Google自动生成、自动更新的数据,它不需要人工干预,而是通过算法和机器学习技术从各种来源获取并解析数据。这些数据可以是来自互联网上的…...
Nginx 负载均衡:优化网站性能与可扩展性的利器
在当今高流量的互联网时代,网站的性能和可扩展性成为了衡量其成功与否的关键因素之一。随着用户量的不断增加,单一服务器往往难以承受巨大的访问压力,这时就需要引入负载均衡技术来分散请求,提高系统的整体性能和可靠性。Nginx&am…...
【Python基础】Python错误和异常处理(详细实例)
本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…...
如何查看串口被哪个程序占用?截止目前最方便的方法
痛点:串口因为某种原因被占用,如何找到罪魁祸首? 做开发的小伙伴们,经常会遇到这样的问题:串口因为某种原因被占用,导致无法通讯,但是又找不到被哪个程序占用。只有重启电脑,才能解…...
深入理解SpringBoot(一)----SpringBoot的启动流程分析
1、SpringApplication 对象实例化 SpringApplication 文件 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {// 传递的source其实就是类Bootstrapreturn new SpringApplication(sources).run(args);// 实例化一个SpringApplication对象执…...
MySql基础-单表操作
1. MYSQL概述 1.1 数据模型 关系型数据库 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 使用表存储数据,格式统一,便于维护 使用SQL语言操作,标准统一&…...
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
基于STM32设计的SD卡数据读取与上位机显示系统 演示视频: 基于STM32设计的SD卡数据读取与上位机显示系统 简介:本研究的主要目的是基于STM32F103微控制器,设计一个能够读取SD卡数据并显示到上位机的系统。SD卡的数据扇区读取不仅是为了验证存…...
SpringBoot开发——整合Redis
文章目录 1、创建项目,添加Redis依赖2、创建实体类Student3、创建Controller4、配置application.yml5、整合完成 Redis ( Remote Dictionary Server )是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(…...
OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 测试轮廓的凸性。 该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。 cv:…...
P5425 [USACO19OPEN] I Would Walk 500 Miles G
*原题链接* 很离谱的题。首先可以想到暴力连边,整个图为一个完全图,将所有的边选出来,然后从小到大一条条加入,当剩下集合数量 <K 的时候就结束。答案为加入的最后一条边的大小。如果用prim算法的话时间复杂度为。足以通过此题…...
Java高级Day41-反射入门
115.反射 反射机制 1.根据配置文件re.properties指定信息,创建Cat对象并调用hi方法 SuppressWarnings({"all"}) public class ReflectionQuestion {public static void main(String[] args) throws IOException {//根据配置文件 re.properties 指定信息…...
在Linux系统上使用Docker部署java项目
一.使用Docker部署的好处: 在Linux系统上使用Docker部署项目通常会大大简化部署流程,因为Docker可以将应用程序及其依赖打包到一个独立的容器中。 Docker打包应用程序时会将其与所有依赖项(操作系统、库等)一起打包。这样&#…...
【C++】标准库IO查漏补缺
【C】标准库 IO 查漏补缺 文章目录 系统I/O1. 概述2. cout 与 cerr3. cerr 和 clog4. 缓冲区5. 与 printf 的比较 系统I/O 1. 概述 标准库提供的 IO 接口,包含在 iostream 文件中 输入流: cin输出流:cout / cerr / clog。 输入流只有一个 cin&#x…...
python简单易懂的lxml读取HTML节点及常用操作方法
python简单易懂的lxml读取HTML节点及常用操作方法 1. 初始化和基本概念 lxml 是一个强大的pyth库,用于处理XML和HTML文档。它提供了类似BeautifulSoup的功能,但性能更高。在使用lxml时,通常会先解析HTML或XML文档,得到一个Eleme…...
Java | Leetcode Java题解之第406题根据身高重建队列
题目: 题解: class Solution {public int[][] reconstructQueue(int[][] people) {Arrays.sort(people, new Comparator<int[]>() {public int compare(int[] person1, int[] person2) {if (person1[0] ! person2[0]) {return person2[0] - perso…...
安卓获取apk的公钥,用于申请app备案等
要申请app的icp备案等场景,需要app的 证书MD5指纹和公钥,示例如下: 步骤1:使用keytool从APK中提取证书 1. 打开命令行,cd 到你的apk目录,如:app/release 2. 解压APK文件: unzip yo…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
