当前位置: 首页 > article >正文

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

目录

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

为什么

数据举例

递归对比函数

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


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

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

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

为什么

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

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

数据举例
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.kler.cn/news/155487.html

相关文章:

  • Matlab下载许可证文件 教程(在账号有许可证的前提下)
  • C语言速通笔记(1-40)
  • JavaWeb(三)
  • 弦理论:技术视角下的宇宙密码
  • python第3天之函数
  • Windows :VSCode安装和运行Django
  • 解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效
  • Apache Doris 详细教程(二)
  • <蓝桥杯软件赛>零基础备赛20周--第8周第2讲--排序的应用
  • zabbix监控nginx
  • 营业执照上包含信息详解
  • go自定义端口监听停用-------解决端口被占用的问题
  • 理解宏任务和微任务:JavaScript 异步编程的必备知识(上)
  • JavaScript学习-1
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • 使用 SDKMAN 管理多版本本地 Java 环境---Centos8 Windows
  • Java中各种数据类型之间的转换
  • 【OpenCV】图像上绘制文字cv2.putText()函数用法,添加倾斜透明水印
  • 说说你所了解的Java代理,有遇到过Spring Aop失效场景吗
  • [原创]C++98升级到C++20的复习旅途-从汇编及逆向角度去分析“constexpr“关键字
  • Centos7设置永久路由
  • 线性表 力扣67. 二进制求和
  • 三、Zookeeper数据模型
  • 价值投资选股的方法
  • synchronized的实现原理
  • Docker常用进本命令【必备基本功】
  • nodejs基于vue的社区物业缴费报修管理系统7vwc6
  • fasterxml 注解组装实体
  • 【车载开发系列】Flash支持的安全功能
  • C语言面试之旅:掌握基础,探索深度(面试实战之c语言指针数组下篇)