vue3中监视 Reactive对象中的属性

news2025/1/18 6:54:14

  watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组

一、框架:

<template>
  <div class="divBox">
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>汽车:{{ person.car.brand1 }} 、 {{ person.car.brand2 }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeCarName">修改汽车名称</button>
    <button @click="changeCarPrice">修改汽车价格</button>
    <button @click="changeCar">修改汽车</button>
  </div>
</template>

二、数据源:

<script setup name="watchReactive">
import { ref, reactive, watch } from "vue";

const person = reactive({
  name: "张三",
  age: 18,
  car: { brand1: "奔驰", brand2: "奥迪", price: 100000 },
});

function changeName() {
  person.name = person.name + "~";
}
function changeAge() {
  person.age = person.age + 1;
}
function changeCarName() {
  person.car.brand1 = person.car.brand1 + "~";
}
function changeCarPrice() {
  person.car.brand2 = person.car.brand2 + "$";
}
function changeCar() {
  person.car = { brand1: "爱玛电动车", brand2: "小刀就是好", price: 88888 };
}

</script>

三、数据、方法

监听(Watch)

单个数据的属性值

可以使用以下方式:

1.数据为String/number属性值
<script setup name="watchReactive">

//现在开始进行监视,不能监视对象的属性,只是一个字符串
// watch(person.name,(newValue,oldValue) => {
//     console.log("newValue",newValue);
//     console.log("oldValue",oldValue);
// });

//成功监视!

watch(()=>{return person.name},(newValue,oldValue) => {
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
});

//推荐指数****
watch(()=> person.name,(newValue,oldValue) => {
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
});

</script>
2.监听的数据为Object对象时

当我们监听函数中的对象时:

<script setup name="watchReactive">

//不能使用这种方式进行监视,他只是一个字符串
 watch(person.car.brand1,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 })

<script/>

系统提示:

<script setup name="watchReactive">

/**可以使用这种方式进行监视,
 * 但是只能监视对象中的属性,不能监视对象本身
 * 对象本身,已经不是响应式的对象了,被重新赋值了
 */
 watch(person.car,(newValue,oldValue) =>{
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
})

<script/>

 以下这种方式,我们只能监视数据对象整体,并不能监视到数据对象中的属性!!!


<script setup name="watchReactive">

//我们尝试监听数据中的对象属性
 watch(()=> person.car,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 })

</script>

上面虽然可以监视数据中的对象属性,但是并不是最优的,因为其并不能监视对象本身本修改的情况,下面是推荐使用的监听方式 ,既可以监听到对象中的属性,又可以监听到数据本身


<script setup name="watchReactive">

//推荐程度*******
 watch(()=> person.car,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 },{deep:true})

</script>

监听单个数据的多个属性值

当我们进行监听数据的多个属性值时:

我们可以整体返回一个对象数组,用来监听不同的数据类型:

<script setup name="watchReactive">

/**
 * 监视对象内部多个属性
 */
// watch(()=>{return [person.name,person.car.brand1]},(newValue,oldValue) =>{
//     console.log("newValue",newValue);
//     console.log("oldValue",oldValue);
// },{deep:true})

watch(()=>[person.name,person.car.brand1],(newValue,oldValue) =>{
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
},{deep:true})
</script>

也可以这样书写:

<script setup name="watchReactive">

//推荐程度*******
watch([() => person.name, () => person.car.brand1],
  (newValue, oldValue) => {
    console.log("newValue", newValue);
    console.log("oldValue", oldValue);
  },{ deep: true });
</script>

好处在于,我们可以针对没个属性进行监视!!!

vue3官方文档:

侦听数据源类型​

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

const x = ref(0)
const y = ref(0)

// 单个 ref
watch(x, (newX) => {
  console.log(`x is ${newX}`)
})

// getter 函数
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

注意,你不能直接侦听响应式对象的属性值,例如:

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}`)
  }
)

deep谨慎使用

深度侦听需要遍历被侦听对象中的所有嵌套的属性,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深圳大学/大学物理实验2】超声探伤实验 实验前预习题答案参考

一、单选题 共 6 小题 共 31 分 1. (5分)电偶极矩的单位是&#xff08; &#xff09; 学生答案&#xff1a;B √ A. B. C. D. 2. (5分)本实验中产生超声波的方法是&#xff08; &#xff09; 学生答案&#xff1a;D √ A. 热电效应 B. 光电效应 C. 电磁效应 D. 压电效…

【专题】关系数据库标准语言SQL

1. SQL语言介绍 SQL(Structured Query Language)是结构化查询语言&#xff0c;它是一种在关系数据库中定义和操纵数据的标准语言&#xff0c;是用户与数据库之间进行交流的接口。 1.1 SQL数据库的体系结构 使用SQL关系数据库的特点&#xff1a; SQL用户可以是应用程序&#xf…

闯关leetcode——100. Same Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/same-tree/description/ 内容 Given the roots of two binary trees p and q, write a function to check if they are the same or not. Two binary trees are considered the same if they are…

PHP简单登录系统

目录 用户数据文件 (users.php) HTML 登录表单 (login.html) PHP 登录处理脚本 (login_process.php) 欢迎页面 (welcome.php) 注销脚本 (logout.php) 效果展示 用户名和密码错误时 用户名和密码正确时 用户数据文件 (users.php) 用于保存用户信息&#xff0c;用户名和他…

【PUSCH的时域资源分配】

DCI format 0_0/0_1用于调度PDSCH传输&#xff0c;每种格式都包含了时域和频域资源的分配字段。 和PDSCH一样&#xff0c;PUSCH也支持Type A和Type B两种映射类型&#xff0c;但是有效的S和L组合不同。 同样&#xff0c;当UE通过DCI调度PUSCH时&#xff0c;DCI的时域资源分配…

日语学习柯桥外语培训jlpt备考「意地」是什么意思?

「意地」 N1单词 意地&#xff08;いじ&#xff09; 词性&#xff1a;名词 含义&#xff1a;心术&#xff0c;用心&#xff1b;固执&#xff0c;倔强&#xff1b;志气&#xff0c;气魄&#xff1b;嘴馋&#xff0c;贪婪 例句&#xff1a; ▲自分が始めたことだから意地でもや…

长三角智驾花絮

杜轩第一次去说服清洁工&#xff0c;收养狗儿&#xff0c;结果清洁工说有人收养了狗&#xff0c;结果狗引起交通事故主人赔钱。第二次尝试说服大妈收养狗儿&#xff0c;大妈给狗儿一脚&#xff0c;说狗儿把她厕所搞脏了。第三次看路上的美女&#xff0c;去说服美女收养&#xf…

UE5运行时动态加载场景角色动画任意搭配-全流程代码(四)

UE5运行时动态加载场景、角色、角色动画、相机动画任意搭配,Android、iOS也可以跑,横竖屏兼容,手机竖屏: 1、场景切换UWorld处理 在通过OpenLevel进行场景切换的时候,UWorld会发生变化,需要我们获取正确的UWorld。 1、在GameInstance监听Level加载 void UMyGameInsta…

nemo-guardrails简单应用

环境&#xff1a;openEuler、python 3.11.6、nemoguardrails 0.10.1、Azure openAi 背景&#xff1a;工作需要&#xff0c;进行调研期间&#xff0c;发现问题太多&#xff0c;且国内网站好多没说明具体问题 时间&#xff1a;20241014 说明&#xff1a;搭建过程中主要是下载h…

ARMA3 STATUS_ACCESS _VIOLATION退出解决方法测试

方法1 [SOLVED] 0xc0000005 status_access_violation ARMA 3 (youtube.com) 启动器-参数-平台 改32位。 没卵用。 方法2 ArmA 3 "STATUS_ACCESS_VIOLATION" FIX!! [2018] (youtube.com) steam-ARMA3-属性-通用-启动选项&#xff1a;粘贴路径&#xff0c;后面加-…

基于FPGA的以太网设计(三)

通过前文介绍了RGMII接口时序我们可以知道&#xff0c;RGMII接口是在时钟信号的上升沿和下降沿均进行数据的传输&#xff0c;而FPGA则在时钟的单沿传输数据&#xff0c;因此我们需要编写代码将RGMII接口转换为GMII接口。 由于前面的介绍我们知道RTL8211默认工作在延时状态&…

体能攻略梳理

最近在锻炼身体&#xff0c;但如何才能更好的锻炼&#xff1f;最近看了慕课上的体能攻略&#xff08;https://www.icourse163.org/learn/HZIC-1206696841&#xff09;&#xff0c;讲的特别好。希望大家看了就是会了&#xff0c;看了就是做了&#x1f601;。 基本知识 减脂别只…

数据库常见面试

8道面试题 目录 目录 7道面试题 1.怎样进行sql优化 4、group by优化 5、limit优化 6、count优化 7、update优化 2.。怎样查看sql执行情况呢(哪个关键字)&#xff0c;说说你对这个关键字的认识 4) possible_key&#xff1a; 5) key 3.说说你对innodb和 myisam的理解 …

pdf阅读器哪个好用?5个软件帮助你快速阅读pdf文件

pdf阅读器哪个好用&#xff1f;5个软件帮助你快速阅读pdf文件 如果你在寻找好用的 PDF 阅读器&#xff0c;有很多强大的软件可以帮助你轻松、高效地阅读和处理 PDF 文件。这些软件不仅可以简单地查看文件&#xff0c;还能提供标注、评论、注释和文档管理等额外功能。以下是5款…

请确保已在git上配置你的user.name和user.email

问题&#xff1a;使用vscode在远程服务器上暂存修改报错&#xff1a; 原因&#xff1a;未在远程服务器上配置该项目对应的git的username和useremail 解决方法&#xff1a; 在vscode中新建一个终端 命名&#xff1a; git config --global user.email "youexample.com&qu…

Linux集群化软件安装,前置

1.准备多个虚拟机 可以选择克隆方式,更快捷 2.配置各个主机IP地址 命令 ; vim /etc/sysconfig/network-scripts/ifcfg-ens33 进入这个文件,操作请看我的文章Linux更改固定IP地址https://blog.csdn.net/m0_72898512/article/details/142718753?spm1001.2014.3001.5501 各个主…

个人博客搭建 | Hexo框架

文章目录 1.Hexo安装2.创建博客3.将博客通过GitHub来部署4.更换主题 1.Hexo安装 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。搭建Hexo首先要…

采购管理系统有哪些功能?

对于制造型企业来说&#xff0c;采购成本占据重要位置&#xff0c;直接影响企业利润空间&#xff0c;低采购成本可提升企业竞争力&#xff0c;高采购成本则可能压缩企业生存发展空间。一款好用的采购管理系统可以帮助企业解决降低成本的难题&#xff0c;那么采购管理系统有哪些…

如何轻松上手低代码和零代码平台进行应用开发?

在当今数字化转型加速的时代背景下&#xff0c;企业与个人对于快速开发高效的应用程序的需求日益增长。低代码&#xff08;Low Code&#xff09;和零代码&#xff08;No Code&#xff09;平台应运而生&#xff0c;为用户提供了无需深入了解编程语言&#xff0c;即可创建复杂业务…

javaweb-xml映射文件编写sql语句

可以使用注解的方式&#xff0c;也可以使用xml映射的方式&#xff0c;一般简单sql语句使用注解&#xff0c;复杂的使用xml映射。