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.mfbz.cn/a/773774.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程池实践篇

文章目录 配置线程池参数定义参数实体bean配置线程池使用 配置线程池参数 定时任务线程池基础参数 # 定时任务线程池基础参数 task:pool:corePoolSize: 5 # 核心线程数maxPoolSize: 20 # 设置最大线程数keepAliveSeconds: 300 # 设置线程活跃时间,单位秒queueCapa…

[C++初阶]vector的初步理解

一、标准库中的vector类 1.vector的介绍 1. vector是表示可变大小数组的序列容器 , 和数组一样,vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大…

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

FPGA基本资源介绍

文章目录 FPGA资源介绍1.可编程输入输出单元(IOB)2.可配置逻辑块(CLB)3.数字时钟管理模块(DCM)4.嵌入式块RAM(BLOCK RAM / BRAM)4.1其他ram 5.丰富的布线资源6.底层内嵌功能单元7.内嵌专用硬核软核、硬核、以及固核的概念 FPGA资源介绍 1.可编程输入输出单元(IOB) 可编程输入…

大语言模型融合知识图谱的问答系统研究

文章目录 题目摘要方法实验消融实验 题目 大语言模型融合知识图谱的问答系统研究 论文地址:http://fcst.ceaj.org/CN/10.3778/j.issn.1673-9418.2308070 项目地址:https://github.com/zhangheyi-1/llmkgqas-tcm/ 摘要 问答系统(Question Ans…

数据库管理-第217期 Oracle的高可用-02(20240704)

数据库管理217期 2024-07-04 数据库管理-第217期 Oracle的高可用-02(20240704)1 GDS简介2 GDS架构2.1 全局数据服务池2.2 全局数据服务域2.3 全局服务管理2.4 全局数据服务目录2.5 Oracle通知服务 3 GDS简图3.1 负载均衡3.2 只读服务失败转移3.3 多主复制…

1014-33SF 同轴连接器

型号简介 1014-33SF是Southwest Microwave的2.92 mm 同轴连接器。这款连接器采用钢制外壳,铍铜触点,并经过金镀处理,以确保良好的导电性和耐腐蚀性。适用于高频微波应用,例如测试设备、通信系统等。 型号特点 频率范围&#xff1…

openEuler 社区 2024 年 5 月运作报告

概述 2024年5月,在 OpenAtom openEuler(简称:“openEuler”)技术委员会例会上,经技术委员会委员审定,同意开发者在社区成立 SBOM SIG、Intelligence SIG。SBOM SIG 主要围绕 SBOM 构建openEuler社区软件供应链安全&…

【React】Ant Design -- Table分页功能实现

实现步骤 为Table组件指定pagination属性来展示分页效果在分页切换事件中获取到筛选表单中选中的数据使用当前页数据修改params参数依赖引起接口重新调用获取最新数据 const pageChange (page) > {// 拿到当前页参数 修改params 引起接口更新setParams({...params,page})…

Finding and exploting an unused API endpoint

Using 0$ account buy a piece of lether priced at $133 1、尝试访问api接口 大概率可能访问不到,但是可以尝试访问下 /api/swagger/v1 /openapi.json 2、页面功能点寻找 api send to Repeter 3、Find Supported HTTP请求 POST方法测试 通过测试得知支持GET方法和PATC…

[产品]理解产品

课程安排 认识互联网行业 1.行业对比 2.互联网公司 广义理解: 互联网行业的公司大都以计算机网络技术为基础, 利用网络平台帮助企业提供服务, 并以此获取收入 3.行业细分 典型产品 认识产品经理 1.职责差异 不同类型的公司, 产品经理岗位所负责的工作都是略有差异的 1,外包…

Docker Desktop 简易操作指南 (Windows, macOS, Linux)

1. 下载最新版本 Docker Desktop https://www.docker.com/products/docker-desktop/ 2.启动 Docker Desktop 3.常用命令(在 cmd 或 Terminal 中执行) #列出所有镜像(Images) docker images #列出所有容器(Containers&…

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”,就是云存储,前端发文件到服务器,服务器不用再存到本地磁盘,可以直接传给“阿里云OSS”,存在网上。 二、怎么用 大体逻辑: 细分的话就是: 1、准…

visual studio 2022配置和使用protobuf

上图证明,我真的测了好多遍,测了好多版本的protobuf,花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

Lesson 48 Do you like ... ? Do you want ... ?

Lesson 48 Do you like … ? Do you want … ? 词汇 fresh a. 新鲜的【食物】 搭配:fresh water 淡水    fresh man 新生    fresh air 新鲜空气    fresh egg 新鲜鸡蛋 例句:我们喜欢新鲜的空气。    We like fresh egg. egg n. 蛋【通…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果,比如自适应屏幕尺寸、固定边距等等,首先要理清楚几个基本概念和设置:锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

Qualcomm QCA206x EasyMesh For Ubuntu

1. 引言 关于EasyMesh概念我们这里就不再过多的赘述,此篇文档的目的是,让广大初学者,有一个很方便的平台进行EasyMesh的学习和测试。 2. X86 Ubuntu平台 2.1 硬件环境准备 备注:QCA206x WiFi module推荐使用移远的FC64E/FC66E。…

代码随想录算法训练营第74天:路径总结[1]

代码随想录算法训练营第74天:路径总结 ‍ A * 算法精讲 (A star算法) 卡码网:126. 骑士的攻击(opens new window) 题目描述 在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

【深度学习练习】心脏病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是RNN RNN与传统神经网络最大的区别在于,每次都会将前一次的输出结果,带到下一隐藏层中一起训练。如下图所示: …