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

《Vue3学习手记2》

今天主要学习Vue3中的数据监视:
ps: 代码中的注释写的很详细,这样更有利于理解

watch

作用: 监视数据的变化(和Vue2中watch作用一致)
特点: Vue3中的watch只能监视以下四种数据:

  1. ref创建定义的数据(基本类型、对象类型)
  2. reactive定义的数据(对象类型)
  3. 函数返回一个值(getter函数)
  4. 一个包含上述内容的数组

语法: watch接收三个参数:第一个参数是监视的对象;第二个参数是执行的回调函数(回调函数会收到两个值:新值和旧值);第三个参数是是否进行深度监视或者是否打开页面就监视

下面分情况概述:

情况一:监听ref定义的基本数据及对象数据

<template><div class="app"><!-- <h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button> --><!-- ========================================================= --><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button><button @click="changeperson">点击修改全部信息</button></div>
</template><script lang="ts" setup name="Person">// 知识点一:watch监视// 首先 引入watch// watch监视的是ref定义的基本响应式数据import {ref,watch} from "vue"// 数据// const name=ref("张三")// const age=ref(18)// // 方法// function changeName(){//   name.value+="~"// }// function changeAge(){//   age.value++// }// watch在vue2是配置项,在vue3中是函数。// 对name进行监视// watch(name,(newValue,oldValue)=>{//   console.log("name改变了",newValue,oldValue)// })// =========================================================// 知识点二:watch监视的是ref定义的对象数据const person=ref({name:"张三",age:18})function changeName(){person.value.name+="~"}function changeAge(){person.value.age++}function changeperson(){person.value={name:"李四",age:19}}// 对person进行监视,此时只能监视到整个person的变化,而不能检测到person里属性的变化// watch(person,(newValue,oldValue)=>{//   console.log("person改变了",newValue,oldValue)// })// 添加第三个参数,可以检测到person中属性name和age的变化watch(person,(newValue,oldValue)=>{console.log("person改变了",newValue,oldValue)},{deep:true,immediate:true})// =========================================================// 注意:// 进行深度监视后,name和age属性可以被监视到。// 监测name和age返回的新值和旧值都是新值,因为他们是同一对象// 监测整个person对象返回的分别是新值和旧值,因为他们不是同一对象,因为整个person都被修改了</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}
</style>

情况二: 监视reactive定义的对象数据

<template><div class="app"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button><button @click="changeperson">点击修改全部信息</button></div>
</template><script lang="ts" setup name="Person">// 知识点一:watch监视// 首先 引入watch// watch监视的是reactive定义的对象响应式数据import {reactive,watch} from "vue"const person=reactive({name:"张三",age:18})function changeName(){person.name+="~"}function changeAge(){person.age++}function changeperson(){Object.assign(person,{name:"李四",age:20})}// 对person进行监视,此时只能监视到整个person的变化,也能能检测到person里属性的变化(reactive对象数据,默认开启深度监视watch(person,(newValue,oldValue)=>{console.log("person改变了",newValue,oldValue)})// =========================================================// 注意:// 监测name和age返回的新值和旧值(newValue和oldValue)都是新值,因为他们是同一对象// 监测整个person对象返回的newValue和oldValue分别是新值和旧值,因为他们不是同一对象
// =========================================================   //总结:  //reactive定义的对象数据和ref相同,都是对象中的属性 返回的新值和旧值都是新值,而整个person对象返回的newValue和oldValue分别是新值和旧值</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}
</style>

情况三:(函数返回一个值)监视一个getter函数

常用于监视某个属性

<template><div class="app"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><h2>汽车:{{person.car.C1}}-{{ person.car.C2 }}</h2><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button><button @click="changeC1">点击修改C1</button><button @click="changeC2">点击修改C2</button><button @click="changecar">点击修改汽车</button></div>
</template><script lang="ts" setup name="Person">// 知识点一:watch监视// 首先 引入watch// watch监视:函数返回一个值(getter函数)import {reactive,watch} from "vue"const person=reactive({name:"张三",age:18,car:{C1:"柯尼塞格",C2:"布加迪威龙"}})function changeName(){person.name+="~"}function changeAge(){person.age++}function changeC1(){person.car.C1="奥迪"}function changeC2(){person.car.C2="大众"}function changecar(){person.car={C1:"特斯拉",C2:"小米"}   //这里注意,由于car也是一个对象,所以不用用Object assign来定义}// =========================================================// 要求一:只对name属性进行监视   此时需要写成getter函数(watch可以检测到getter函数),判断该属性是不是对象类型,不是对象类型,应写成函数式// watch(()=>{return person.name},(newValue,oldValue)=>{// 可简写为:watch(()=>person.name,(newValue,oldValue)=>{console.log("name改变了",newValue,oldValue)})//要求二:只对car属性进行监视   判断该属性是不是对象类型,是对象类型,应写成函数式(推荐),也可以直接写watch(()=>person.car,(newValue,oldValue)=>{console.log("car改变了",newValue,oldValue)},{deep:true})// =========================================================// 总结:监视的是对象里的属性(注意:首先要满足是对象,不管是对象里的基本数据还是对象数据类型),最好都写成函数式,注意点:若是也需要监视对象内部,则需手动开启深度监视。</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}
</style>

情况四:监视多个数据(包含上述内容的数组)

<template><div class="app"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><h2>汽车:{{person.car.C1}}-{{ person.car.C2 }}</h2><button @click="changeName">点击修改姓名</button><button @click="changeAge">点击修改年龄</button><button @click="changeC1">点击修改C1</button><button @click="changeC2">点击修改C2</button><button @click="changecar">点击修改汽车</button></div>
</template><script lang="ts" setup name="Person">// 知识点一:watch监视// 首先 引入watch// watch监视:监视上述内容的数组(多个数据)import {reactive,watch} from "vue"const person=reactive({name:"张三",age:18,car:{C1:"柯尼塞格",C2:"布加迪威龙"}})function changeName(){person.name+="~"}function changeAge(){person.age++}function changeC1(){person.car.C1="奥迪"}function changeC2(){person.car.C2="大众"}function changecar(){person.car={C1:"特斯拉",C2:"小米"}   //这里注意,由于car也是一个对象,所以不用用Object assign来定义}// =========================================================// 对name属性和car对象里面的C1属性进行监视   watch([()=>person.name,()=>person.car.C1],(newValue,oldValue)=>{console.log("name和car被修改了",newValue,oldValue)},{deep:true})// 此时newValue返回的是name和car.C1返回的新值组成的数组
</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}
</style>

watchEffect

watch对比watchEffect
1.都能监听响应式数据的变化,不同的是监听数据变化的方式不同
2. watch:要明确指出监视的数据,当需要监视的数据过多时,操作麻烦
3.watchEffect:不用明确指出监视的数据(函数中用到哪些属性,那就监视哪些属性),它会自己分析。

<template><div class="app"><h2>水温:{{temp}}</h2><h2>水位:{{height}}</h2><button @click="changeTemp">点击水温+10</button><button @click="changeHeight">点击水位+10</button></div>
</template><script lang="ts" setup name="Person">// 知识点:watchEffect监视// 首先 引入watchEffectimport {ref,watch,watchEffect} from "vue"const temp=ref(0)const height=ref(10)function changeTemp(){temp.value+=10}function changeHeight(){height.value+=10}
// 要求:当水温大于60或水位大于80,向服务器发送请求
// 对水温和水位进行监视  (不是对象里的属性,可直接写)// =========================================================// 第一种写法:// watch([temp,height],()=>{   //value表示newValue,返回的是newTemp和newHeight组成的数组//   // 解构//   // const [newTemp,newHeight]=value//   // 进行判断//   if(temp.value>60 || height.value>80){//     console.log("向服务器发送请求")//   }// })// 第二种写法:// watch([temp,height],(value)=>{   //value表示newValue,返回的是temp和height的新值组成的数组//   // 进行判断//   if(value[0]>60 || value[1]>80){//     console.log("向服务器发送请求")//   }// })// 第三种写法:// watch([temp,height],(value)=>{   //value表示newValue,返回的是newTemp和newHeight组成的数组//   // 解构//   const [newTemp,newHeight]=value//   // 进行判断//   if(newTemp>60 || newHeight>80){//     console.log("向服务器发送请求")//   }// })// =========================================================// 使用watchEffect写:(直接使用,watchEffect会自己分析),适用于监视的对象足够多的情况watchEffect(()=>{if(temp.value>60 || height.value>80){console.log("向服务器发送请求")}})
</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}
</style>

相关文章:

《Vue3学习手记2》

今天主要学习Vue3中的数据监视&#xff1a; ps: 代码中的注释写的很详细&#xff0c;这样更有利于理解 watch 作用: 监视数据的变化(和Vue2中watch作用一致) 特点: Vue3中的watch只能监视以下四种数据: ref创建定义的数据&#xff08;基本类型、对象类型&#xff09;reactiv…...

在pycharm中搭建yolo11分类检测系统1--PyQt5学习(一)

实验条件&#xff1a;pycharm24.3autodlyolov11环境PyQt5 如果pycharm还没有配PyQt5的话就先去看我原先写的这篇博文&#xff1a; PyQT5安装搭配QT DesignerPycharm&#xff09;-CSDN博客 跟练参考文章&#xff1a; 目标检测系列&#xff08;四&#xff09;利用pyqt5实现yo…...

【经验记录贴】使用配置文件提高项目的可维护性

mark一下。 整体修改前后如下&#xff1a; 课题&#xff1a; 在项目中有一个支持的文件类型的FILE_TYPE的定义&#xff0c; 这个是写死在主程序中&#xff0c;每次增加可以支持的文件类型的时候&#xff0c;都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...

从JSON到SQL:基于业务场景的SQL生成器实战

引言 在数据驱动的业务场景中&#xff0c;将业务需求快速转化为SQL查询是常见需求。本文将通过一个轻量级的sql_json_to_sql函数&#xff0c;展示如何将JSON格式的查询描述转换为标准SQL语句&#xff0c;并结合实际业务场景验证其功能。 核心代码解析 1. 代码实现 def sql_j…...

空格键会提交表单吗?HTML与JavaScript中的行为解析

在网页开发中&#xff0c;理解用户交互细节对于提供流畅的用户体验至关重要。一个常见的问题是&#xff1a;空格键是否会触发表单提交&#xff1f;本文将通过一个简单的示例解释这一行为&#xff0c;并探讨如何使用HTML和JavaScript来定制这种交互。 示例概览 考虑以下HTML代…...

06 - 多线程-JUC并发编程-原子类(二)

上一章&#xff0c;讲解java &#xff08;java.util.concurrent.atomic&#xff09; 包中的 支持基本数据类型的原子类&#xff0c;以及支持数组类型的原子类&#xff0c;这一章继续讲解支持对实体类的原子类&#xff0c;以及原子类型的修改器。 还有最后java &#xff08;java…...

vue3 实现谷歌登录

很多人都是直接在 index.html 文件中引入的&#xff0c;刚开始我也那样写但是谷歌的api只能调起一次后续就不会生效了 我的登录是个弹窗&#xff0c;写在app.vue 文件中 const isGoogleLoaded ref(true);onMounted(async () > {initialize(); }); // 初始化 const initi…...

SOME/IP中”客户端消费“及”服务端提供”的解析

先上结论 AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数&#xff0c;谁就是消费者 AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数&#xff0c;谁就是服务端 Server 端&#xff1a;AREthAddProvidedEventGroup → 声明 &…...

GO语言入门:字符串处理1(打印与格式化输出)

13.1 打印文本 在 fmt 包中&#xff0c;Print 函数用于打印&#xff08;输出&#xff09;文本信息。依据输出目标的不同&#xff0c;Print 函数可以划分为三组&#xff0c;详见下表。 按应用目标分组函数说明将文本信息输出到标准输出流&#xff0c;一般是输出到屏幕上Print将…...

Linux 深入浅出信号量:从线程到进程的同步与互斥实战指南

知识点1【信号量概述】 信号量是广泛用于进程和线程间的同步和互斥。信号量的本质 是一个非负的整数计数器&#xff0c;它被用来控制对公共资源的访问 当信号量值大于0的时候&#xff0c;可以访问&#xff0c;否则将阻塞。 PV原语对信号量的操作&#xff0c;一次P操作使信号…...

Oracle数据库数据编程SQL<9.1 数据库逻辑备份和迁移exp和imp之导出、导入>

EXP (Export) 和 IMP (Import) 是 Oracle 提供的传统数据导出导入工具,用于数据库逻辑备份和迁移。尽管在较新版本中已被 Data Pump (EXPDP/IMPDP) 取代,但在某些场景下仍然有用。 目录 一、EXP 导出工具 1. 基本语法 2. 常用参数说明 3. 导出模式 3.1 表模式导出 3.2 用…...

DotnetCore开源库SampleAdmin源码编译

1.报错: System.Net.Sockets.SocketException HResult0x80004005 Message由于目标计算机积极拒绝&#xff0c;无法连接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…...

Kaggle-Disaster Tweets-(二分类+NLP+模型融合)

Disaster Tweets 题意&#xff1a; 就是给出一个dataframe包含text这一列代表着文本&#xff0c;文本会有一些词&#xff0c;问对于每条记录中的text是真关于灾难的还是假关于灾难的。 比如我们说今天作业真多&#xff0c;这真是一场灾难。实际上这个灾难只是我们调侃而言的。…...

搭建一个网站需要选择什么配置的服务器?

一般要考虑网站规模、技术需求等因素来进行选择。 小型网站&#xff1a;个人博客、小型企业官网等日均量在 1000 以内的网站&#xff0c;一般推荐2 核 CPU、4GB 内存、50GB 硬盘&#xff0c;带宽 1 - 5M。如果是纯文字内容且图片较少的小型网站&#xff0c;初始阶段 1 核 CPU、…...

idea如何使用git

在 IntelliJ IDEA 中使用 Git 的详细步骤如下&#xff0c;分为配置、基础操作和高级功能&#xff0c;适合新手快速上手&#xff1a; ​一、配置 Git​ ​安装 Git​ 下载并安装 Git&#xff0c;安装时勾选“Add to PATH”。验证安装&#xff1a;终端输入 git --version 显示版本…...

webpack vite

​ 1、webpack webpack打包工具&#xff08;重点在于配置和使用&#xff0c;原理并不高优。只在开发环境应用&#xff0c;不在线上环境运行&#xff09;&#xff0c;压缩整合代码&#xff0c;让网页加载更快。 前端代码为什么要进行构建和打包&#xff1f; 体积更好&#x…...

.Net 9 webapi使用Docker部署到Linux

参考文章连接&#xff1a; https://www.cnblogs.com/kong-ming/p/16278109.html .Net 6.0 WebApi 使用Docker部署到Linux系统CentOS 7 - 长白山 - 博客园 项目需要跨平台部署&#xff0c;所以就研究了一下菜鸟如何入门Net跨平台部署&#xff0c;演示使用的是Net 9 webAPi Li…...

PyTorch 根据官网命令行无法安装 GPU 版本 解决办法

最近遇到一个问题&#xff0c;PyTorch 官网给出了 GPU 版本的安装命令&#xff0c;但安装成功后查看版本&#xff0c;仍然是 torch 2.6.0cpu 1. 清理现有 PyTorch 安装 经过探索发现&#xff0c;需要同时卸载 conda 和 pip 安装的 torch。 conda remove pytorch torchvision …...

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全 资源宝整理分享&#xff1a;https://www.htple.net PHP防火墙&#xff08;作者&#xff1a;悠悠楠杉&#xff09; 验证测试&#xff0c;链接后面加上?verify_cs1后可以自行测试 <?php //复制保存zzwaf.php$we…...

使用 Vitis Model Composer 生成 FPGA IP 核

本文将逐步介绍如何使用 Vitis Model Composer 生成 FPGA IP 核&#xff0c;从建模到部署。 在当今快节奏的世界里&#xff0c;技术正以前所未有的速度发展&#xff0c;FPGA 设计也不例外。高级工具层出不穷&#xff0c;加速着开发进程。传统上&#xff0c;FPGA 设计需要使用硬…...

Day08 【基于jieba分词实现词嵌入的文本多分类】

基于jieba分词的文本多分类 目标数据准备参数配置数据处理模型构建主程序测试与评估测试结果 目标 本文基于给定的词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;然后将词基于词表进行初步编码&#xff0c;之后经过网络层&#xff0c;输出在已知类别标…...

BERT、T5、ViT 和 GPT-3 架构概述及代表性应用

BERT、T5、ViT 和 GPT-3 架构概述 1. BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09; 架构特点 基于 Transformer 编码器&#xff1a;BERT 使用多层双向 Transformer 编码器&#xff0c;能够同时捕捉输入序列中每个词的左右上下文信息…...

倚光科技:以创新之光,雕琢全球领先光学设计公司

在光学技术飞速发展的当下&#xff0c;每一次突破都可能为众多领域带来变革性的影响。而倚光&#xff08;深圳&#xff09;科技有限公司&#xff0c;作为光学设计公司的一颗璀璨之星&#xff0c;正以其卓越的创新能力和深厚的技术底蕴&#xff0c;引领着光学设计行业的发展潮流…...

数据结构(六)——红黑树及模拟实现

目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示&#xff1a; 红黑树的查找 红黑树的验证 红黑树代码如下所示&#xff1a; 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…...

【家政平台开发(48)】家政平台安全“攻防战”:渗透测试全解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

Python爬虫-爬取全球股市涨跌幅和涨跌额数据

前言 本文是该专栏的第52篇,后面会持续分享python爬虫干货知识,记得关注。 本文中,笔者将基于Python爬虫,实现批量采集全球股市行情(亚洲,美洲,欧非,其他等)的各股市“涨跌幅”以及“涨跌额”数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。…...

解决 Vue 中 input 输入框被赋值后,无法再修改和编辑的问题

目录 需求&#xff1a; 出现 BUG&#xff1a; Bug 代码复现 解决问题&#xff1a; 解决方法1&#xff1a; 解决方法2 关于 $set() 的补充&#xff1a; 需求&#xff1a; 前段时间&#xff0c;接到了一个需求&#xff1a;在选择框中选中某个下拉菜单时&#xff0c;对应的…...

【差分隐私相关概念】瑞丽差分隐私(RDP)-瑞丽散度约束了贝叶斯因子后验变化

分步解释和答案&#xff1a; 在Rnyi差分隐私&#xff08;RDP&#xff09;框架中&#xff0c;通过贝叶斯因子和Rnyi散度的关系可以推导出关于后验变化的概率保证。以下是关键步骤的详细解释&#xff1a; 1. 贝叶斯因子的定义与分解 设相邻数据集 D D D 和 D ′ D D′&#x…...

vue3 onMounted 使用方法和注意事项

基础用法 / 语法糖写法 <script> import { onMounted } from vue;// 选项式 API 写法 export default {setup() {onMounted(() > {console.log(组件已挂载);});} } </script><script setup> onMounted(() > {console.log(组件已挂载); }); </scrip…...

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句&#xff0c;用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续的操作都将基于该镜像进行。例如&#xff0c;FROM python:3.9-slim-buster 表示使用 Pyt…...