vue监听数据时 newValue, oldValue操作处理

要只存入新更改的数据,可以在 watch 的回调函数中进行比较,筛选出有变化的属性并将其存入新数组。以下是一个示例代码,假设要监听的对象为 obj:

data() {return {differenceArray: [], obj: { /* 对象的初始属性 */ }};
},
computed:{newObj(){return JSON.parse(JSON.stringify(this.obj)); }
},
watch:{newObj:{handler(newValue, oldValue){const changedProperties = Object.entries(newValue).filter(([key, value]) => value!== oldValue[key]); this.differenceArray.push(...changedProperties.map(([key, value]) => ({ key, value }))); },deep:true}
}

在上述代码中,使用 Object.entries() 获取对象的所有属性键值对。通过 filter() 方法筛选出在新值和旧值中不相等的属性。然后,使用 map() 方法将这些变化的属性转换为包含 key(属性名)和 value(新更改后的值)的对象,并使用扩展运算符 … 将这些对象添加到 differenceArray 数组中。
这样,differenceArray 数组中就只会存储实际发生更改的属性及其新值。
如果监听的是数组,可以类似地进行处理。例如,对于数组 arr:

data() {return {differenceArray: [], arr: [ /* 数组的初始元素 */ ]};
},
computed:{newArr(){return [...this.arr]; }
},
watch:{newArr:{handler(newValue, oldValue){const changedIndices = newValue.reduce((indices, value, index) => {if (value!== oldValue[index]) {indices.push(index); }return indices;}, []); changedIndices.forEach(index => {this.differenceArray.push({ index, value: newValue[index] }); });},deep:true}
}

在这个示例中,通过遍历新数组和旧数组,找出值不相同的索引位置,并将这些索引存到 changedIndices 数组中。然后,遍历 changedIndices,将对应的索引和新值作为对象添加到 differenceArray 数组中。

要解决 newVal 和 oldVal 一样的问题,并将新更改的数据存入 differenceArray 数组,可以使用 Vue 的 watch 选项中的 deep: true 来深度监听对象的变化。以下是修改后的代码示例:

watch: {newEditTableVariables: {handler(newValue, oldValue) {this.differenceArray = []; // 遍历 newValue 中的每个项目newValue.forEach(item => {// 在 oldValue 中找到对应的项目const oldItem = oldValue.find(idx => idx.value === item.value); // 如果没有找到对应的旧项目,或者找到的旧项目与新项目不同,则将新项目添加到 differenceArray 中if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) { this.differenceArray.push(item);}});console.log(this.differenceArray);},deep: true, // 深度监听对象内部属性的变化immediate: true // 立即执行 handler 函数}
}

在上述代码中,使用 JSON.stringify() 来比较新旧项目是否全等。通过深度监听,当 newEditTableVariables 对象内部的属性发生变化时,handler 函数会被触发。然后,通过遍历 newValue 并与 oldValue 进行比较,将有差异的项目添加到 differenceArray 数组中。
注意,直接修改对象的属性可能无法触发响应式更新,导致 watch 监听不到变化。如果 newEditTableVariables 是一个复杂的对象,确保在对象内部属性发生变化时,使用 Vue 提供的方法(例如 Vue.set() 或数组的变异方法)来进行修改,以确保响应式系统能够正确检测到变化。另外,添加 immediate: true 是为了在初始化时立即执行一次 handler 函数,以便获取初始值和后续变化的比较。
如果 newEditTableVariables 是一个数组,并且你使用了一些可能导致 Vue 无法检测到数组变化的方式(例如直接通过索引修改数组元素),则需要使用 Vue 提供的数组变异方法,如 splice() 等,来确保变化能够被正确监听。例如:

this.$set(this.newEditTableVariables, index, newValue); 
// 或使用 splice 方法
this.newEditTableVariables.splice(index, 1, newValue); 
watch: {newEditTableVariables: {handler(newValue, oldValue) {this.differenceArray = []; // 遍历 newValue 中的每个项目newValue.forEach(item => {// 在 oldValue 中找到对应的项目const oldItem = oldValue.find(idx => idx.value === item.value); // 如果没有找到对应的旧项目,或者找到的旧项目与新项目不同,则将新项目添加到 differenceArray 中if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) { this.differenceArray.push(item);}});console.log(this.differenceArray);},deep: true, // 深度监听对象内部属性的变化immediate: true // 立即执行 handler 函数}
} 

这段代码是 Vue 中 watch 选项的使用示例,用于监听 newEditTableVariables 对象的变化。
以下是对代码的详细解释:
watch:Vue 提供的用于监听数据变化的选项。
newEditTableVariables:要监听的数据源。
handler(newValue, oldValue):当数据源发生变化时触发的回调函数。接收两个参数:newValue 表示变化后的新值,oldValue 表示变化前的旧值。
在回调函数内部:
this.differenceArray = []:初始化一个空数组 differenceArray,用于存储变化的差异数据。
通过 newValue.forEach(item => {…}) 遍历 newValue 中的每个项目。
在内部的嵌套循环中,使用 oldValue.find(idx => idx.value === item.value) 在 oldValue 中查找与当前 item 的 value 属性相等的项目,并将其赋值给 oldItem。
通过条件判断 if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) 来检查是否没有找到对应的旧项目,或者找到的旧项目与新项目不相等(使用 JSON.stringify 进行序列化比较)。如果满足条件,说明有差异,就将当前项目 item 使用 this.differenceArray.push(item) 添加到 differenceArray 数组中。
deep: true:表示进行深度监听。当 newEditTableVariables 是一个复杂的嵌套对象时,启用深度监听可以确保对象内部属性的变化也能被监听到。
immediate: true:表示立即执行 handler 函数。即使在初始化时,newEditTableVariables 的值没有发生变化,也会立即执行一次 handler 函数,将初始值作为 oldValue 传入,方便进行一些初始的处理或比较。
总体来说,这段代码的目的是在 newEditTableVariables 对象发生变化时,找出变化的差异部分并存储在 differenceArray 数组中,以便后续使用或处理这些差异数据。通过深度监听和立即执行的设置,能够更全面地捕捉和处理对象的变化情况。
如果你发现这段代码中存在“无用的数据”,可能是指在实际使用中,newEditTableVariables 对象中的某些数据或属性并不是你真正关心的差异部分。要解决这个问题,你可以根据具体的业务需求,进一步优化差异比较的逻辑。例如,只比较特定的属性、或者针对特定类型的数据进行特殊处理等。
例如,如果你只想比较对象中某些特定属性的变化,可以修改比较条件:

if (!oldItem || oldItem.specificProperty!== item.specificProperty) { this.differenceArray.push(item);
}

其中 specificProperty 替换为你实际想要比较的属性名。
或者,如果对象中的数据结构比较复杂,可能需要根据具体情况设计更复杂的差异比较算法,以准确获取你所需的差异数据。

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

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

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

相关文章

java数据结构集合复习之包装类和泛型

前言: 这是我最一年学习java的一部分的回顾总结 1.包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1基本数据类型和对应的包装类 ----—基本数据类型包装类…

ubuntu软件源的两种格式和环境变量

1. ubuntu的/etc是什么目录? 在Ubuntu操作系统中,/etc/是一个特殊的目录,它包含系统的配置文件。这些配置文件用于设置各种系统和应用程序的参数和选项。 一般来说,用户可以在这个目录下找到各种重要的配置文件,如网络…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括为以下几点,Web3 ETF仍是一项新兴投资产品,其长期表现仍存在不确定性。投资者在投资Web3 ETF之前应仔细研究相关风险,并做好充分的风险评估。北京木奇移动技术有限公司,专业的软件外包开发公司&#xf…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要:助办公室一族纵横职场,实现高效舒适办公! 在日常商务办公中,对于办公室一族来说总有太多“难难难难难点”:工作任务繁琐,熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题,职业…

BBA车主,千万别去试驾问界M9

文 | AUTO芯球 作者 | 雷慢&响铃 我劝你啊,千万别去试驾问界M9, 不然啊,可能1个小时50万就没了, 不信你看这个“大冤种”, 他曾经发誓打死不买电车, 考虑了三、四年换宝马X5, 结果谈完…

GNU/Linux - 如何编译kernel

使用 make 命令构建 Linux 内核涉及多个步骤。下面是整个过程的基本概述: 1. 获取内核源代码 * 从 kernel.org 或你的发行版软件仓库下载内核源代码。 * 将源代码解压缩到一个目录中。 2. 配置内核 * 切换到内核源代码目录。 * 可选择清理源代码树:mak…

前端面试题5(前端常见的加密方式)

前端常见的加密方式 在前端进行数据加密主要是为了保护用户的隐私和提升数据传输的安全性。前端数据加密可以采用多种方法,以下是一些常见的加密技术和方法: 1. HTTPS 虽然不是直接的前端加密技术,但HTTPS是保障前端与后端数据传输安全的基…

关于MCU-Cortex M7的存储结构(flash与SRAM)

MCU并没有DDR,所以他把代码存储在flash上,临时变量和栈运行在SRAM上。之所以这么做是因为MCU的cpu频率很低,都是几十MHZ到一二百MHZ,flash的读取速度能够满足cpu 的取指需求,但flash 的写入速度很慢,所以引…

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况,那么你知道你的手机号为什么会被停用吗?接下来,关于手机号被停用的问题,跟着小编一块来了解一下吧。 ​停机的两种形态: 1、第一个是局方停机,即语音、短信和流量都不…

xmind2testcase工具将测试用例从Xmind转为CSV导入禅道

使用xmind编写测试用例,使用xmind2testcase工具将测试用例从Xmind转为CSV导入禅道,便于管理。 1.工具准备 第一步:安装python 第二步:安装xmind2testcase工具 运行-cmd-打开命令提示符弹窗,输入安装命令 安装命令&…

意图数据集HWU、Banking预处理

当谈到意图数据集时,HWU、Banking和Clinc是三个常见的数据集。以下是关于这三个数据集的介绍: 目录 一、数据集介绍 HWU数据集 Banking数据集 Clinc数据集 二、数据集预处理 数据处理 数据存储 数据类别分析 句子长度统计 一、数据集介绍 HW…

嵌入式硬件电路常用设计软件

目录 1. Cadence Allegro 2. PADS 3. Altium Designer 4. Multisim 5. Protues 1. Cadence Allegro 功能: Cadence Allegro是Cadence公司推出的先进PCB(Printed Circuit Board,印刷电路板)设计布线工具,也是目前…

华为HCIP Datacom H12-821 卷26

1.单选题 在VRRP中,同一备份组的设备在进行VRRP报文认证时,以下哪一参数不会影响Master设备和Backup设备认证协商结果 A、认证字 B、优先级 C、认证方式 D、VRRP版本 正确答案: B 解析: 优先级只会影响谁是主谁是备&…

AI产品经理能力模型的重点素质:人文素养和灵魂境界

在AI产品经理的能力模型中,我最想提的差异化关键点,就是“人文素养和灵魂境界”。 1 为什么“人文素养和灵魂境界”非常重要? 一、“人文素养和灵魂境界”如何影响AI产品设计? 例1:面对一个具体的AI场景&#xff0…

25考研,数二全程跟的张宇老师请问660(做了一半)880和张宇1000题应该怎么选择?

跟张宇老师,也可以做其他的题集,不一定非要做1000题 我当初考研复习的时候,也听了张宇老师的课程,但是我并没有做1000题 因为1000题对于我来说太难了。做了一章之后,就换成其他的题目了。 对于大家来说,…

【机器学习实战】Baseline精读笔记

比赛用到的库 numpy:提供(多维)数组操作 pandas:提供数据结构、数据分析 catboost:用于机器学习的库,特别是分类和回归任务 sklearn.model_selection:包含模型选择的多种方法,如交…

Android 监听网络状态变化(无切换中间态版)

需求: 获取当前的网络状态与类型(WIFI、数据流量)监听网络状态真正变化监听网络类型发生变化 业务场景: 用户打开 App 时、使用过程中,出现无网络时,显示 Toast 提示。但当 wifi、数据流量 互相切换的过…

ppt接单渠道大公开‼️

PPT 接单主要分两种:PPT 模板投稿和PPT 定制接单,我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间,做一些 PPT 模板上传到平台,只要有人下载你的模板,你就有收入。如果模板质量高,简直就是一…

【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

文章目录 定义结构Demo | 代码Subject目标类Observer抽象观察者观察者1 | CPU监听器观察者2 | 内存监听器客户端 | Client 优点适合场景 定义 所谓观察者模式就是你是被观察的那个对象,你爸爸妈妈就是观察者,一天24h盯着你,一旦你不听话&…

【BUUCTF-PWN】7-[第五空间2019 决赛]PWN5

参考:BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com) 格式化字符串漏洞原理详解_printf 任意内存读取-CSDN博客 32位小端排序,有栈溢出保护 运行效果: 查看main函数 存在格式化字符串漏洞 输…