随笔 - 42,  文章 - 0,  评论 - 12,  阅读 - 50989
本文主要封装方法,实现用户离开表单编辑页面时弹出提示框,若表单数据发生变化,则提示用户是否保存当前页面的信息,如图:

 

封装方法:

复制代码
 1 /**
 2  * 比较俩个对象之间的差异,项目中多处用到监听表单数据是否改动,故封装此方法
 3  * 如果数据改动,则返回新旧对象记录改动字段的新旧值
 4  *
 5  * by wang
 6  * */
 7 export function diffObj(obj1, obj2) {
 8   function getTypeByObj (obj) {
 9     return Object.prototype.toString.call(obj).match(/^\[object ([a-zA-Z]*)\]$/)[1];
10   }
11   function isEmptyObject (obj) {
12     for (let key in obj) {
13       return false;
14     };
15     return true;
16   }
17   if (!obj1 || isEmptyObject(obj1) || !obj2 || isEmptyObject(obj2)) {
18     return null;
19   }
20   let diffRes = {
21     old_val: {},
22     new_val: {}
23   };
24   for (let k in obj2) {
25     // 判断数据类型是否一致
26     if (getTypeByObj(obj2[k]) === getTypeByObj(obj1[k])) {
27       // 比较 “Array”和“Object”类型
28       if (getTypeByObj(obj2[k]) === 'Array' || getTypeByObj(obj2[k]) === 'Object') {
29         const diffData = diffObj(obj1[k], obj2[k]);
30         if (!isEmptyObject(diffData)) {
31           diffRes.old_val[k] = diffData.old_val;
32           diffRes.new_val[k] = diffData.new_val;
33         }
34       } else if (obj1[k] !== obj2[k]) { // 比较其他类型数据
35         diffRes.old_val[k] = obj1[k];
36         diffRes.new_val[k] = obj2[k];
37       }
38     } else {
39       if ([undefined, null, ''].includes(obj1[k]) && [undefined, null, ''].includes(obj2[k])) {
40         // 这三类数据可视为相等,不做处理
41       }else {
42         diffRes.old_val[k] = obj1[k];
43         diffRes.new_val[k] = obj2[k];
44       }
45     }
46   }
47   // 若没有变化,返回null
48   if (isEmptyObject(diffRes.old_val) || isEmptyObject(diffRes.new_val)) {
49     return null;
50   }
51   return diffRes;
52 }
复制代码

如果返回值为null,则代表没有改变,否则返回改变的属性和值,如图:

 

脚踏实地行,海阔天空飞~

posted on   coder__wang  阅读(754)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示