解决vue3中watch 监听不到旧值的问题,亲测有效!

问题描述

这个问题是我在公司vue3项目的时候发现的一个问题,watch 在监听对象/数组变量的变化时,发现对象的数据变化时 旧数据 获取到的和新数据是一样的 类似于下面这样

const obj=ref({a:'我是原来的值',b:6,
})obj.a='改变值'watch(obj,(nel,old)=>{
console.log ('打印出来的值',nel,old) 
},{deep:true})

数据变化之后显示出来的如下 :

打印出来的值 {a:'改变值',b:6 } {a:'改变值',b:6 }

当我打印出同样数据的时候 我一脸懵逼 甚至于怀疑自己代码写错了。但是检查一圈 发现代码没有任何错误。然后我用数组去实验了一下 发现 监听数组时也监听到的都是新数据。


原因分析:

发现这个问题之后 我去查看了vue3的官方文档 发现如下图,vue官方说 不能直接不能直接侦听响应式对象的属性值,需要用一个返回该属性的 getter 函数。大家可以点击下方地址查看vue3的官方文档

网址:侦听器 | Vue.js (vuejs.org)

重点解析:     必须看这里 才能了解原理

接着 我研究了一下了解到了不能直接侦听响应式对象的属性值:

因为Vue 3使用了新的响应式系统,它在内部使用了Proxy来实现数据的响应式。

Vue 3的watch选项提供了两个参数:新值和旧值。但是,在旧值参数中,Vue 3只会提供一个代理对象,而不是真正的旧值。这是因为Vue 3的响应式系统将数据封装在Proxy对象中,以便在数据变化时触发更新。

由于代理对象是一个引用类型,它会在数据变化时自动更新。因此,无法直接访问到真正的旧值。如果需要对比旧值和新值,可以手动保存旧值,并与新值进行比较。


解决方案:

了解了上面的原因 ,我想到了 可以用计算属性 就可以继续监听整个对象, 当然大家也可以更具vue文档来一个个属性去监听(我觉得这样太麻烦了),所以最终解决方案 请看下面代码

原理是既然引用类型不能获取旧值 那我们就用computed 定义一个新的变量 这个变量的值是字符串,那么字符串不是引用类型 就可以监听变化 获取旧值。自此解决此问题

const obj=ref({a:'我是原来的值',b:6,
})//我们再用一个计算属性来监听字符串obj对象的变化
const objStr=computed(() => JSON.stringify(obj))obj.a='改变值'//这样就能监听了
watch(objStr,(nel,old)=>{
//记得用的时候转回对象就好
console.log ('打印出来的值',nel,old) 
},{deep:true})

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

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

相关文章

studio3T mongodb 根据查询条件更新字段 或 删除数据

1. mongodb 等于、不等于$ne、不包含 $nin 以及批量更新数据的使用。 业务场景: 在集合中,根据查询条件,更新数据状态。 实现代码: 1. 部门名称为XXX、状态不等于“完好”的、并且不包含这些编码的数据先查询出来2. 再把状态更…

rust sqlx包(数据库相关)使用方法+问题解决

可以操作pgsql、mysql、mssql、sqlite 异步的,性能应该不错,具体使用有几个坑 除了sqlx库,还有对于具体数据库的库,比如postgres库 演示以pgsql为例,更新时间2024.1.6 官方github: sqlx github rust官方文档&#xff1…

【Python学习】Python学习4-运算符

目录 【Python学习】Python学习4-运算符 前言算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级参考 文章所属专区 Python学习 前言 本章节主要说明Python的运算符。主要有 算术运算符 比较(关系&…

强化学习3——马尔可夫性质、马尔科夫决策、状态转移矩阵和回报与策略(上)

与多臂老虎机问题不同,马尔可夫决策过程包含状态信息以及状态之间的转移机制。如果要用强化学习去解决一个实际问题,第一步要做的事情就是把这个实际问题抽象为一个马尔可夫决策过程。 马尔可夫决策过程描述 马尔可夫决策过程以智能体在与环境交互的过…

【linux笔记1】

目录 【linux笔记1】文件内容的理解用户管理用户管理命令添加用户切换用户修改用户信息删除用户 用户组 【linux笔记1】 文件内容的理解 etc文件夹:etc是拉丁语"et cetera"的缩写,意思是“和其他的”或“等等”。在linux系统中,“…

[嵌入式C][入门篇] 快速掌握基础2 (数据类型、常量、变量)

开发环境: 网页版:跳转本地开发(Vscode):跳转 文章目录 一、基本变量大小和范围(1)在8位/32位单⽚机中:测试代码结果:64位机器结果:32位机器(单片机)无对齐限…

[NAND Flash 5.3] QLC NAND 已来未热,是时候该拥抱了?

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 3600 字。 前言 伴随着闪存芯片的发展趋势,现如今便宜、大容量的SSD基本上都需要上QLC闪存芯片了。一时间QLC有山雨欲来之势,大容量QLC SSD的普及…

Geoserver扩展发布MySQL视图功能

Geoserver中并不自带mysql数据发布功能&#xff0c;需要扩展外部插件。 1、示例以geoserver-2.20.5版本进行演示&#xff0c;所以MySQL插件需要到该版本对应的“Extensions”标题下查找&#xff0c;下载地址&#xff1a;GeoServer&#xff0c;详见下图 2、选择MySQL进入下载页…

Linux第11步_解决“挂载后的U盘出现中文乱码”

学习完“通过终端挂载和卸载U盘”&#xff0c;我们发现U盘下的中文文件名会出现乱码&#xff0c;现在讲解怎么解决这个问题。其实就是复习一下“通过终端挂载和卸载U盘”&#xff0c;单独讲解&#xff0c;是为了解决问题&#xff0c;一次性搞好&#xff0c;我们会不长记性。 在…

【100条mysql常用命令】

当然&#xff0c;这里是一些常用的 MySQL 命令列表&#xff0c;用于管理数据库和执行各种查询操作&#xff1a; SHOW DATABASES; - 显示所有数据库CREATE DATABASE database_name; - 创建新数据库USE database_name; - 选择要操作的数据库DROP DATABASE database_name; - 删除…

数据在内存中的存储之大小端

今天也是努力学编程&#xff0c;敲代码的一天&#xff01; 1.什么是大小端 其实超过一个字节的数据在内存中存储的时候&#xff0c;就有存储顺序的问题&#xff0c;按照不同的存储顺序&#xff0c;我们分为大端字节序 存储和小端字节序存储&#xff0c;下面是具体的概念: &…

HIL(硬件在环)技术汇总梳理

HIL&#xff08;Hardware-in-the-Loop&#xff09;测试领域的知名公司有dSPACE、NI、Vector和speedgoat等&#xff0c;以下是针对这几家HIL技术的对比分析&#xff1a; 文章目录 dSPACE NI Vector speedgoat 总结 dSPACE dSPACE成立于1988年&#xff0c;起源自德国的帕德…

vue3项目中axios的常见用法和封装拦截(详细解释)

1、axios的简单介绍 Axios是一个基于Promise的HTTP客户端库&#xff0c;用于浏览器和Node.js环境中发送HTTP请求。它提供了一种简单、易用且功能丰富的方式来与后端服务器进行通信。能够发送常见的HTTP请求&#xff0c;并获得服务端返回的数据。 此外&#xff0c;Axios还提供…

C++学习笔记(二十二):c++ 隐式转换与explicit关键字

c允许编译器对代码执行一次隐式转换。 #include<iostream> #include<string>class Entity { public:std::string name;int age;Entity(int x) {age x;}Entity(std::string x){name x;} }; void PrintEntity(Entity e) {std::cout << e.age << "…

buuctf 逆向 number_game

这是一题二叉树逆向 正常递归建立树的代码为&#xff1a; VOID BinaryTree::BuildTree(Tree*& root) {cout << "输入-1即结束" << endl;INT Val 0;cin >> Val;if (Val -1)return;root new Tree(Val);cout << "请输入" &l…

FSMC—扩展外部SRAM

一、SRAM控制原理 STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间&#xff0c;但当程序较大&#xff0c;内存和程序空间不足时&#xff0c;就需要在STM32芯片的外部扩展存储器了。STM32F103ZE系列芯片可以扩展外部SRAM用作内存。 给STM32芯片扩展内存与给…

基于云平台技术的自动泊车浅谈

基于云平台技术的自动泊车浅谈 一、引言 自动泊车技术是当前汽车技术的重要发展方向之一&#xff0c;它能够帮助驾驶员自动完成泊车操作&#xff0c;提高驾驶安全性。基于云平台技术的自动泊车创新&#xff0c;将为自动泊车技术的发展带来新的突破。 二、云平台技术概述 云…

【计算机网络】TCP原理 | 可靠性机制分析(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

sensor 点亮出图后,画面全黑是为什么?

同事在点一个思特威的 sensor sc035hgs&#xff0c;这个 sensor 主要负责数据采集&#xff0c;然后给到后面的 NN&#xff08;神经网络&#xff09;去做处理。 点亮出图后&#xff0c;画面很黑&#xff0c;如下图所示&#xff1a; 因为没拿到板子&#xff0c;只能盲猜&#xf…

Python 注释的方法

在Python中&#xff0c;有两种常见的注释方法&#xff1a; 单行注释&#xff1a;使用#符号来注释一行代码。在#符号后面的内容将被视为注释&#xff0c;不会被解释器执行&#xff0c;如&#xff1a; # 这是一个单行注释 print(hello world!) # 打印字符串多行注释&#xff1…