前端请求patch接口,只传入已修改字段值的字段

news/2024/7/9 23:55:45 标签: 前端, react.js, vue

目录

前端仅传递发生更改的字段

为什么

数据举例

递归对比函数

从回显数据到提交更新接口的模拟操作


前端仅传递发生更改的字段

在实际开发中前端肯定会遇到一个更新需求,回显数据 => 修改数据 => 请求更新接口这个步骤。

通常建议前端仅传递发生更改的字段,而不是将所有字段都传递给后端。

为什么

减少数据传输量: 如果只传递更改了的字段,可以减小数据传输的大小,降低网络开销,特别是在网络条件不理想的情况下更为重要。

提高性能: 传递更改了的字段可以减少后端的处理工作。只处理需要更新的字段可以提高性能,减少数据库操作的负担。

数据举例
const form = {
  a: 1,
  b: 2,
  c: 3,
  d: [1, 2, 3, 4],
  e: [{f: 5, g: 6}],
  h: {
       i: 7,
       g: 8
  }
}

//修改字段
form.a = 2
form.h.i = 2
form.d[0] = 2


//接口提交params
{
    a: 2,
    d: [2, 2, 3, 4],
    h: {
        i: 2
    }
}

以下是递归对比原始对象和修改后的对象的函数,返回一个只修改过字段值的对象

递归对比函数
function findObjectChanges(original, modified, path = []) {
  if(original instanceof Array && modified instanceof Array) {
    if(JSON.stringify(original) !== JSON.stringify(modified)) {
      return modified
    } else {
      return {}
    }
  }
  const changes = {};
  for (const key in modified) {
    const currentPath = [...path, key];
    if (typeof modified[key] === 'object' && modified[key] !== null) {
      // 递归比较嵌套对象
      const nestedChanges = findObjectChanges(original[key], modified[key], currentPath);
      if (Object.keys(nestedChanges).length > 0) {
        changes[key] = nestedChanges;
      }
    } else {
      // 比较基本数据类型
      if (original[key] !== modified[key]) {
        changes[key] = modified[key];
      }
    }
  }
  return changes;
}
从回显数据到提交更新接口的模拟操作
let form = {}  // 定义的form,不管是react的useState定义或者vue的reactive ref定义

const formData = fetchDataApi(...)
//接口数据
{ 
  a: 1,
  b: 2,
  c: 3,
  d: [1, 2, 3, 4],
  e: [{f: 5, g: 6}],
  h: {
    i: 7,
    g: 8
  }
}

form = JSON.parse(JSON.stringify(formData)) //从接口获取到回显数据,生成新对象

form.a = 2   //模拟vue或者react的form双向绑定更改值的操作
form.h.i = 2
form.d[0] = 2

const formParams = findObjectChanges(formData, form)  //递归对比修改了哪些字段

if(JSON.stringify(formParams) === "{}") {  //判断是否修改了字段
  alert('您还未修改任何数据')
} else {
  fetchUpdateApi(formParams)  // 请求更新接口
  alert('数据已提交')
}


http://www.niftyadmin.cn/n/5235492.html

相关文章

使用 Kettle 完成数据 ETL

文章目录 使用 Kettle 完成数据 ETL数据清洗数据处理 使用 Kettle 完成数据 ETL 现在我们有一份网站的日志数据集,准备使用Kettle进行数据ETL。先将数据集加载到Hadoop集群中,然后对数据进行清洗,最后加载到Hive中。 在本地新建一个数据集文…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸,直到有一天想去学渣的世界看看,结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而,长时间的文稿创作不仅费时费力,还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…

如何通过缺口发现短线机会?

一、认识缺口形态 新手一开始接触技术分析,可能都以为“缺口”是一个很高深的技术形态。其实缺口很简单,就是K线图中的价格空白区域,也就是股价上涨或下跌的过程中,跳过了这个价格。根据跳空的方向不同,缺口可以分为向…

网络运维与网络安全 学习笔记2023.12.3

网络运维与网络安全 学习笔记 第三十三天 今日目标 目录-文件基本管理、vim文本编辑、用户账号管理 组账号管理、归属控制、权限控制 目录-文件基本管理 ls 列目录及文档属性 ls - List 格式:ls[选项]…[目录或文件路径] 1.如果不以/开始,表示相对路径(省略了当前所在位置…

leetcode 201 数字范围按位与

leetcode 201 题目题解代码 题目 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left、right 端点)。 具体示例如下: 题解 本题是一个在思维上的方法,不…

Redis中分布式锁的使用

在分布式系统中,如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题,有这样一个案例,有一件商品购买规则为一个用户只能购买一次,如果使用同步锁锁住用户id&am…

【Redis】Redis底层原理(持久化 分布式锁)

目录 持久化 RDB 给哪些内存数据做快照? RDB文件的生成是否会阻塞主线程 bgsave执的行流程 RDB文件 RDB的优缺点 RDB的优点 RDB的缺点 Redis中RDB导致的数据丢失问题 AOF 使用AOF AOF的工作流程 命令写入 重写机制 重启加载 文件校验 RDB-AOF混合持久化 Red…