项目说明

项目是由UmiJS创建的(React+Ant Design4.2),项目需求是富文本编辑器录入多样内容,可供查看。

通过各方探索以及客户的沟通,选定了KindEditor编辑器,通过iframe嵌入。但仍有很多不符合要求的地方,所以要进行很多魔改。

同时伴随着客户的使用体验,针对问题进行修复。

起因及详细说明

客户提出一个问题:表格整体由居左修改为居中后,点击保存,在显示区域里仍是居左,修改无效。

项目页面中,编辑器所在位置是一个弹窗里,编辑器通过子组件里iframe嵌入,通信是props和postMessage/onMessage

// 父页面
<Modal onOk={handleOk}>
  ...
  <KindEditor 
  initValue={initValue}
  setContent={setValueList}
  ></KindEditor>
  ...
</Modal>
const handleOk = () =>{
  // 参数校验
  // 接口请求
}
// 子组件
const KindEditor = (props) =>{
  ...
  const setContent = props.setContent;
  window.onmessage = (e)=>{
    setContent(e.data)
  }
  useEffect(()=>{
    ...
    editorDOM.contentWindow.postMessage(
      { initValue: props.initValue }
    );
    ...
  },[props.initValue])

}

探查原因

编辑器问题

由于之前客户有提出过文字选中内容加粗偶尔无效问题,而且我在测试环境点击操作几次后,发现表格修改后保存是成功的,所以这一次最初怀疑是编辑器功能不稳定。

但细想下又觉得不对,加粗偶尔失效是在编辑器内操作时候内容文字效果就没有变成加粗效果,而这次对表格修改之后确实是成为了居中。

只是保存之后再查看时候还是和没修改一样,所以应该不是编辑器功能不稳定。

当在本地把代码运行后,在本地环境中终于复现了该问题。

经过几次操作的对比测试,发现有两种情况下结果不同:

  • 修改完之后,马上点击提交,结果是不成功的
  • 修改完之后,稍等一会儿,做下其他操作(比如:点击下页面或者滑动下滚动条…),点击提交按钮,结果是成功的。

所以觉得是编辑器通过postMessage/onMessage传值因为网速问题导致传值速度慢,所以在提交按钮中触发方法handleOk中加了延时,

// 参数校验
...
setTimout(()=>{
  // loading处理和接口请求
  ...
},1000)

延时结束后再进行接口请求。

但从1秒改到5秒,修改后立刻点击按钮,结果仍是不成功。这就很奇怪了

又在编辑器传值onMessage方法和页面中获取valueList位置加了log输出,发现log输出为新值,接口请求传参仍为旧值。

所以开始怀疑是setState异步问题

setState异步问题

自己对react学习了解不深,尝试半小时之后,仍没有解决,所以请同事reac大佬帮忙查看定位。

  • 监听定位

先对valueList进行监听,确认已经是得到了编辑器传来的最新的值,

同时对接口请求之前对valueList进行log输出,为未修改的值。

  • useCallback

经过上一步,确定了编辑器传值确实是没有问题,那么问题的解决就在于如何在接口请求时获取到最新的值。

根据react官方文档,使用useCallback钩子进行处理。

把内联回调函数及依赖项数组作为参数传入 useCallback,它将返回该回调函数的 memoized 版本,该回调函数仅在某个依赖项改变时才会更新

const handleOk = useCallback(()=>{
  handleOkBtn()
},[valueList])

感觉应该是valueList变化之后才会执行回调函数

但测试之后输出效果与之前相同,同时临近下班,且大佬手头还有工作,就暂时搁置。

编辑器change事件

由于问题未解决,所以周一向组长说明问题内容进行deBug,大佬也帮忙写了demo。

结果说明了可能是setState的问题,但代码的写法是没有错。

之前加了许多log输出,但因为其他页面输出log也很多,之前测试没有加统一标识进行过滤,所以这次的测试,对于问题相关的输出加了统一标识前缀。

经过测试,发现点击提交按钮的log输出是在编辑器返回数据之前,这个顺序是不对的。提交方法获取值的时候是旧的,获取完毕之后valueList才拿到新值进行修改。

根据输出信息的输出顺序,发现了一个异常:在表格属性修改后是没有触发编辑器的change事件,而在点击按钮或者点击页面其他地方时才会触发change事件,输出内容。

所以,如果在表格修改后触发change事件,将最新的值传到父组件,那么在提交时获取的一定会是最新的值。

源码修改

经过上述的探索步骤,修改源码成了唯一的选择。

根据表格属性修改弹窗的内容和css样式,找到了源代码中弹窗内容的位置(在8800行左右),弹窗确定按钮的方法实现在8830行左右。

在确定按钮的方法实现中debugger一步步调试加log输出,确定了要修改的位置。

// 修改前
self.hideDialog().focus();
self.cmd.range.moveToBookmark(bookmark);
self.cmd.select();
self.addBookmark();
return;
// 修改后
self.hideDialog().focus();
self.cmd.range.moveToBookmark(bookmark);
self.cmd.select();
self.addBookmark();
// 添加change事件触发,保证表格修改后可以获取最新的值
if (self.options.afterChange) {
    self.options.afterChange.call(self);
}
return;

加上了触发change事件的内容后,测试结果是成功的。

由此,在测试了其他表格修改操作后,给单元格属性的修改方法实现也添加了触发change事件的内容。

问题解决,大吉大利,天下太平。

记一次KindEditor表格修改无效问题

相关文章

  1. 本周推荐 | 电商3D购物新体验:AR量脚和AR试戴背后的算法技术

    推荐语&#xff1a;本文结合了工业实际应用&#xff0c;介绍了工程上精心设计量脚交互流程&#xff0c;算法上融合2d检测、3d重建来实现较为精准的量脚流程&#xff0c;并在一系列算法流程计算上&#xff0c;充分考虑到了算法效率&#xff0c;保证了用户体验&#xff0c;具有很…...

    2023/4/15 5:10:45
  2. 启动hadoop

    /home/deploy/hadoop-2.7.2 curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod x cs && ./cs setup cs install scala:2.13.8 scalac:2.13.8 启动hadoop /home/deploy/hadoop-2.7.2/sbin/start…...

    2023/5/12 3:10:15
  3. 2.22.2、死锁的处理策略

    文章目录1、预防死锁1.1、破坏互斥条件1.2、破坏不剥夺条件1.3、破坏请求和保持条件1.4、破坏循环等待条件2、避免死锁&#xff08;银行家算法&#xff09;2.1、什么是安全序列2.2、安全序列、不安全状态、死锁的联系2.3、银行家算法2.4、Java 实现银行家算法2.5、总结3、死锁的…...

    2023/5/25 9:19:18
  4. linux开机自动运行python服务或者程序(转载)

    进入看到AI那边写了个服务可以实现自动重启之类的 ai那边用的fastapi写的接口 后面可以研究一下 直接在调用函数如run.py封装接口 若想使用systemctl 命令则需要直接把写的 .serverce程序放到 /etc/systemd/system参考以下资料&#xff0c; https://blog.csdn.net/wo1823709…...

    2023/5/22 14:53:49
  5. Python每日一练(20230221)

    目录 1. 不同路径 II 2. 字符串转换整数 (atoi) 3. 字符串相乘 1. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中…...

    2023/4/3 7:23:13
  6. 001 android studio 下载安装

    001 android studio 下载安装 官网下载&#xff1a; https://developer.android.google.cn/studio/features 使用说明&#xff1a; https://developer.android.google.cn/studio/intro?hlzh-cn Android Studio 有三种代码补全类型&#xff0c;您可以通过键盘快捷键使用这些…...

    2023/5/13 14:39:09
  7. 第20讲:Python列表、元组、字符串使用自定义排序规则

    文章目录1.自定义排序方法2.常用作自定义排序的函数、方法3.列表、元组、字符串自定义排序方法3.1.当列表、元组中元素为字符串的排序规则3.2.三者采用str.lower方法实现自定义排序3.2.三者采用len函数实现自定义排序1.自定义排序方法 列表、元组、字符串都可以进行排序&#…...

    2023/4/29 1:19:57
  8. 开源社首届正式成员大会暨2022年度总结会圆满召开

    开源社KAIYUANSHE近期微信公众号订阅功能做调整啦&#xff01;没有被星标的账号在信息流里可能不显示大图了&#xff01;快星标⭐我们&#xff0c;就可以及时看到发布的文章啦&#xff01;STEP01 点击右上角标志STEP02 点击【设为星标】开源社 2023 年度首届全体正式成员大会于…...

    2023/6/3 1:38:56
  9. 【AIGC】百度:跨模态内容生成技术与应用

    百度&#xff1a;跨模态内容生成技术与应用内容生成概览1. 图像生成2. 语言生成3. 视频创作2. AIGC介绍3. 跨模态内容生成3.1 文本生图像&#xff08;文生图&#xff09;3.2 文章转视频3.3 讨论和展望4. 总结内容来源&#xff1a;机器之心&#xff0c;百度文心一格总架构师肖欣…...

    2023/6/2 1:27:19
  10. 栈空间是如何被编译器开辟释放的?

    记得最清楚的是栈有谁管理&#xff1f; 一般只能是由编译器或者os来管理&#xff0c;网上很多文章是说编译器管理的&#xff0c;但是一般一个程序跑起来之后&#xff0c;编译器怎么对他施加影响呢&#xff1f;到现在我都还是不明白。 &#xff08;1&#xff09;函数栈 可执行文…...

    2023/4/27 14:18:38
  11. 【解决方案】Solidworks 装配体中零部件正处于退回状态,无法将其添加到装配体中

    Solidworks装配体中零部件正处于退回状态&#xff0c;无法将其添加到装配体中 Solidworks在装配体中插入子装配体时&#xff0c;提示“装配体中零部件正处于退回状态&#xff0c;无法将其添加到装配体中”&#xff0c;可能直观地会去找子装配体的每一个零件&#xff0c;删掉所退…...

    2023/6/7 1:46:21
  12. 防护设备检测实验室建设完整方案SICOLAB

    防护设备检测实验室建造布局方案SICOLAB一、防护设备检测实验室通常需要划分为几个功能区域&#xff0c;包括&#xff1a;1、样品准备区&#xff1a;用于样品的接收、处理、准备等工作&#xff0c;通常包括样品接收台、洗手池、样品切割机等设备。2、实验操作区&#xff1a;用于…...

    2023/5/28 22:08:07
  13. linux集群技术(二)--keepalived(高可用集群)(一)

    高可用集群简介keepalived简介 1.高可用集群简介 1.1什么是高可用集群 高可用集群&#xff08;High Availability Cluster&#xff0c;简称HA Cluster&#xff09;&#xff0c;是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务&am…...

    2023/5/16 3:17:08
  14. 游山城重庆

    山城楼梯多&#xff0c;路都是上坡。 为了赶早上8点从成都到重庆的动车&#xff0c;凌晨5点半就爬起床来&#xff0c;由于昨天喝了咖啡&#xff0c;所以我将尽3点才睡觉&#xff0c;这意味着我只睡了2个多小时。起来简单休息之后&#xff0c;和朋友协商好时间就一起出门了。 …...

    2023/5/9 13:22:39
  15. SVM支持向量机

    目录 一。线性可分支持向量机 二。使用核解决线性不可分 三。分割超平面 四。输入数据 五。线性可分支持向量机 六。推导目标函数 七。线性支持向量机 八。带松弛因子的SVM拉格朗日函数 九。损失函数分析 十。核函数 1.多项式核函数 2.高斯核 十一。SVM中系数的求解…...

    2023/5/27 20:25:27
  16. 教你数分钟内创建并运行一个 DolphinScheduler Workflow

    点击蓝字 关注我们作者 | 鲍亮&#xff0c;Apache DolphinScheduler PMC Member01Workflow是什么&#xff1f;对于数仓场景和数据湖场景来说&#xff0c;最显著的特点就是数据处理的长流程和高复杂度任务依赖关系&#xff0c;从源数据采集到最终报表数据的生成&#xff0c;中间…...

    2023/5/1 13:42:50
  17. Docker----------day3(tomcat、mysql8、redis6.2.6常用软件安装)

    常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…...

    2023/5/12 4:10:26
  18. 华为OD机试 - RSA 加密算法(Python) | 机试题+算法思路+考点+代码解析 【2023】

    RSA 加密算法 题目 RSA 加密算法在网络安全世界中无处不在 它利用了极大整数因数分解的困难度,数据越大安全系数越高 给定了一个32位正整数,请对其进行因数分解 找出哪两个素数的乘积 输入 一个正整数num 0 < num <= 2147483647 输出描述 如果成功找到以单个空格…...

    2023/5/24 9:24:07
  19. 前端开发环境搭建

    文章目录Node.js是什么安装查看版本入门示例NPM使用 npm 命令安装模块常见命令使用淘宝 NPM 镜像TypeScript安装入门示例从github拉取构建项目如何从零创建一个TypeScript项目规划目录结构新建项目Web App运行服务添加依赖打包使用browserify打包使用webpack打包推荐流程目录配…...

    2023/4/5 6:11:01
  20. 信息熵的定义及物理含义

    本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;information-theory】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 信源符号自信息的数学期望…...

    2023/6/8 16:54:35

最新文章

  1. 浅谈数明深力科隔离驱动器SLMi8235BD 车载充电器(OBC)方案

    数明深力科SLMi823x系列SLMi8235BD隔离驱动技术优势&#xff1a;具有高性能、高性价比、高可靠性的产品特性&#xff0c;应用覆盖UPS、充电桩、服务器电源、通信电源、新能源汽车动力总成系统的车载 OBC 领域。通过CQC认证的。 车载充电器&#xff08;OBC&#xff09;是电动汽…...

    2023/6/9 12:51:51
  2. 第1讲:XMLHttpRequest详解(ajax基础)

    XMLHTTPRequest对象 XMLHTTPRequest对象&#xff0c;是基于XML的HTTP请求。XMLHTTPRequest是一个浏览器接口&#xff0c;使得Javascript可以进行HTTP(S)通讯。自从浏览器提供了XMLHTTPRequest这个接口之后&#xff0c;ajax操作就此诞生。 AJAX Asynchronous JavaScript and X…...

    2023/6/9 12:51:18
  3. 【数据恢复、安全和备份解决方案】上海道宁与LSoft为企业提供先进的技术来处理现代数据安全和保存问题

    需要备份和恢复磁盘、 恢复已删除的文档和照片、 安全擦除磁盘、 监控硬盘健康状况、 甚至在Windows 无法正常启动时修复 PC&#xff1f; Active Data Studio是 一组桌面应用程序 和可引导CD/DVD或USB磁盘 用于将任何系统引导至 Windows恢复环境 开发商介绍 LSoft Te…...

    2023/6/9 12:50:13
  4. 成功解决AttributeError: module ‘numpy‘ has no attribute ‘float‘.

    成功解决AttributeError: module numpy has no attribute float. 问题描述解决方案一&#xff1a;解决方案二&#xff1a; 问题描述 AttributeError: module ‘numpy’ has no attribute ‘float’. np.float was a deprecated alias for the builtin float. To avoid this er…...

    2023/6/9 12:50:01
  5. ssm+java汽车销售分析与管理系统

    此次设计一款汽车销售分析与管理系统&#xff0c;能够对当前销售的车辆的日销售、季度销售以及年度销售进行统计分析、对于车辆的入库出库进行了准确的信息录入。对于销售人员的销售情况进行登记和统计&#xff0c;能够对整个店面的财务情况、盈利情况进行统计。同时对于以上数…...

    2023/6/9 12:49:48
  6. UnityVR--组件7--动画事件BlendTree

    目录 应用1&#xff1a;使用BlendTree实现站立和移动 应用2&#xff1a;人物跳跃事件&播放跳跃动画 应用3&#xff1a;开火动画事件&动画片段中建立事件监听 上一篇&#xff08;组件5--Animation动画&#xff09;已经做了2个动画片段&#xff0c;HeroIdle和HeroJump…...

    2023/6/9 12:49:31
  7. 如何在Windows中将所有本地安全策略设置重置为默认设置

    本地安全策略(secpol.msc)是一个 Microsoft 管理控制台(MMC)管理单元,其中包含管理员可以在计算机或多个设备上配置的规则,用于保护设备或网络上的资源。 本地组策略编辑器(gpedit.msc)管理单元的安全设置扩展允许你将安全配置定义为组策略对象(GPO)的一部分。 你必…...

    2023/6/9 12:49:14
  8. Docker网络教程(二)host 网络教程

    使用 host 网络的联网 本系列的教程涉及直接绑定在 Docker 宿主机网络上而不隔离网络的独立容器的联网问题。如果想了解更多 Docker 网络的理论知识&#xff0c;参考概述。 目的 本教程的目的是启动一个 nginx 容器&#xff0c;直接绑定到 Docker 宿主机的80端口。从网络的角…...

    2023/6/9 12:48:45
  9. python3写一个http接口服务(get, post),给别人调用6

    python3写一个http接口服务(get, post)&#xff0c;给别人调用6 一、python3写一个http接口服务(get, post)&#xff0c;给别人调用6 近年来异步web服务器比较火热&#xff0c;例如falcon/bottle/sanic/aiohttp&#xff0c;今天也来玩玩sanic。 Sanic是一个支持Python 3.7的w…...

    2023/6/9 12:48:29
  10. Qt6 C++基础入门3 对话框与MainWindow

    目录 对话框MainWindow菜单工具栏 对话框 目前的对话框主要有以下几大类 文件对话框( QFile Dialog)消息对话框( QMessageBox)输入对话框( QInputDialog)颜色对话框( QColorDialog)字体对话框( QFontDialog) 这是七大对话框及其基本用法的实例参考&#xff0c;所有代码都写在…...

    2023/6/9 12:48:18
  11. ETC人车关系查询-ETC人车关系查询api接口

    接口地址&#xff1a; https://登录后显示/api/189/363(支持:http/https)) 接口页面&#xff1a;https://www.wapi.cn/api_detail/189/363.html 网站地址&#xff1a;https://www.wapi.cn 接口简介&#xff1a;核验指定人员/企业是否是指定车辆的 ETC 开户人、车辆所有人或 E…...

    2023/6/9 12:47:51
  12. 一文说清,4G语音工牌与WIFI和蓝牙语音工牌的区别

    作为一种创新的无线音频采集和传输设备&#xff0c;4G语音工牌在许多行业和领域都展现出了巨大的优势和广泛的应用场景。 比如在销售场景和服务场景&#xff0c;利用4G语音工牌和NLP、语音识别、机器学习等技术结合&#xff0c;可实现&#xff1a; 帮销售型企业&#xff1a;提…...

    2023/6/9 12:47:36
  13. Linux远程管理协议(RFB、RDP、Telnet和SSH)

    提到远程管理&#xff0c;通常指的是远程管理服务器&#xff0c;而非个人计算机。个人计算机可以随时拿来用&#xff0c;服务器通常放置在机房中&#xff0c;用户无法直接接触到服务器硬件&#xff0c;只能采用远程管理的方式。 远程管理&#xff0c;实际上就是计算机&#xf…...

    2023/6/9 12:46:36
  14. 【 Python 全栈开发 - WEB开发篇 - 29 】MySQL初步

    文章目录 一、MySQL介绍二、SQL语言三、MySQL安装与配置第一步&#xff1a;下载压缩文件第二步&#xff1a;解压第三步&#xff1a;配置第四步&#xff1a;登录 一、MySQL介绍 MySQL 是一个开源的关系型数据库管理系统&#xff0c;它使用 Structured Query Language&#xff0…...

    2023/6/9 12:46:23
  15. 计算机网络开荒2.2-Socket编程

    文章目录 一、Socket概述二、Socket API 概述三、WinSock常用API3.1 常用API3.1.1 WSAStartUP3.1.2 WSACleanup3.1.3 Socket3.1.4 Closesocket3.1.5 bind3.1.6 listen3.1.7 connect3.1.8 accept3.1.9 send, sendto3.1.10 recv, recvfrom3.1.11 etsockopt, getsockopt 3.2 网络字…...

    2023/6/9 12:46:03
  16. C++设计模式享元模式

    以下是一个用 C 实现的享元模式示例代码&#xff1a; #include <iostream> #include <unordered_map> class Flyweight { private: std::string sharedState; public: Flyweight(std::string state) : sharedState(state) {} void operation(std::string uniqu…...

    2023/6/9 12:45:47
  17. Scrum敏捷认证理论基础知识整理

    一、Scrum框架关键点 Scrum框架有3个角色&#xff0c;3个工件&#xff0c;5个事件&#xff0c;5个价值观&#xff0c;简称3355。 3个角色&#xff1a; 产品负责人PO(Product Onwer)开发团队 &#xff08;Develop Team&#xff09;敏捷教练&#xff08;Scrum Master&#xff0…...

    2023/6/9 12:45:35
  18. webgpu之旅03

    19854902 319854902 319854902 319854902 webgpu交Q流群我们找个例子看看别人的renderer three.js v152 首先init函数 看见中间有个对象 WebGPURenderPipelines 跟进去看看 这个构造函数里可以看见有这么些数据 get( renderObject ) {const device this.device;const cache …...

    2023/6/9 12:45:14
  19. 【移动设备】iData 50P 技术规格

    系列文章 【移动设备】iData 50P 技术规格 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130604517 【H5】avalon前端数据双向绑定 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/131067187 【H5】安卓自动更新方案&a…...

    2023/6/9 12:45:02
  20. joplin的安装和使用

    本文主要介绍joplin的安装和坚果云的配合使用 坚果云 先到坚果云的官网注册登录坚果云 官网&#xff1a;https://www.jianguoyun.com/ a、点击右上角昵称 b、点击账户信息 c、安全选项 d、第三方应用管理 e、点击添加应用&#xff0c;输入应用名称Joplin(这里可以自定义) f、…...

    2023/6/9 12:44:50