可视化编辑器撤销重做怎么实现才不会乱? Good“培乐 提问于 2026-03-01 12:00:22 阅读 5 交互 我在做一个拖拽组件的可视化编辑器,现在想加撤销重做功能,但每次操作后状态同步老出问题。比如拖动一个元素后撤销,位置没变回来,或者重做时报错。 我试过用一个数组存历史快照,每次操作就 push 一个新状态,但数据量大了特别卡。也看过别人用命令模式,但不太会写。有没有轻量又稳定的方案? 目前状态是这样存的:history.push(JSON.parse(JSON.stringify(currentState))),但感觉这不是长久之计…… 可视化编辑撤销重做 我来解答 赞 5 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 夏侯香利 Lv1 别存全量快照了,用命令模式只记录增量变化。 // 每个操作就是一个命令对象 const commands = { move: (id, oldPos, newPos) => ({ execute: () => updatePos(id, newPos), undo: () => updatePos(id, oldPos) }), resize: (id, oldSize, newSize) => ({ execute: () => updateSize(id, newSize), undo: () => updateSize(id, oldSize) }) }; // 撤销重做栈 let history = []; let pointer = -1; function doCommand(cmd) { cmd.execute(); history = history.slice(0, pointer + 1); // 干掉后面的 history.push(cmd); pointer++; } function undo() { if (pointer >= 0) history[pointer--].undo(); } function redo() { if (pointer < history.length - 1) history[++pointer].execute(); } 拖动时只存 { id, oldPos, newPos } 这点数据,撤销时反向操作,搞定。 回复 点赞 3 2026-03-01 12:07 加载更多 相关推荐 2 回答 26 浏览 Vue富文本编辑器撤销功能导致光标位置错乱怎么办? 我在用contenteditable做富文本编辑器时,想通过保存历史快照实现撤销功能。但每次undo后光标会跳到开头,而且频繁操作会内存溢出。 现在用Vue维护一个history数组,在input事件... ___子怡 组件 2026-02-15 17:35:29 2 回答 48 浏览 可视化编辑器的快捷键在输入框里失效怎么办? 我在做一个可视化编辑器,给元素添加样式时需要监听快捷键,但发现当光标在输入框里时快捷键完全没反应。比如按Ctrl+C复制属性面板里的代码时,控制台啥都没输出: document.addEventLis... Prog.卓尚 交互 2026-02-10 09:57:35 2 回答 30 浏览 为什么我的可视化编辑器组件拖拽后无法正确显示位置? 我在开发可视化编辑器时,用HTML5拖拽API实现组件库拖拽到画布的功能,但每次拖拽结束后组件位置总偏移了100px。我检查过事件监听和坐标计算逻辑,代码看起来没问题: element.ondrags... UX-爱静 交互 2026-02-09 15:02:26 2 回答 329 浏览 可视化编辑器预览模式滚动条不同步怎么解决? 最近在做可视化表单编辑器时遇到个难题,预览模式和编辑模式的滚动条位置总对不上。我用的是React,通过useState同步两个区域的scrollTop值,但发现滚动条高度计算不准,有时候会出现偏移。 ... Mr-银银 交互 2026-02-02 13:00:35 2 回答 65 浏览 可视化编辑器中如何阻止Ctrl+C/V默认行为同时触发自定义复制操作? 我在开发可视化编辑器时,想用Ctrl+C/V实现元素复制粘贴,但浏览器默认的复制粘贴总是优先触发。我尝试过在keydown事件里加preventDefault,但有时候无效: document.add... シ子硕 交互 2026-01-27 16:51:24 2 回答 57 浏览 富文本编辑器的撤销记录总是占内存,怎么优化? 在开发富文本编辑器时,用数组存每次修改的快照,但发现撤销多次后内存飙升。 试过只存最近20步,但用户频繁修改时还是卡顿。比如选中段落改颜色,每次操作都深拷贝整个DOM结构,这样会不会太笨重?有没有更轻... 公孙晟华 交互 2026-01-27 11:55:35 1 回答 7 浏览 富文本编辑器里怎么实现格式刷功能? 我正在用 contenteditable 做一个简单的富文本编辑器,现在想加个格式刷功能,就是点一下复制当前选中文本的样式,再点另一段文字就应用过去。但不知道怎么准确获取和还原样式,试过 window... 司马卫红 交互 2026-03-03 07:04:20 1 回答 30 浏览 Markdown编辑器上传图片后路径显示404怎么办? 在用Quill.js实现Markdown编辑器时,用户上传图片用FileSaver保存为base64格式,但渲染后图片路径显示404错误。明明保存成功了啊,控制台提示GET blob:null/xxx... 宇文世杰 交互 2026-02-15 15:39:27 2 回答 75 浏览 可视化编辑器中组件属性和配置表单如何保持双向同步? 我在做可视化配置编辑器时遇到个难题,拖拽组件到画布后,右侧表单显示组件属性。当我修改表单输入时,组件样式没更新。试过用Vue的v-model双向绑定,但发现表单值变化后组件属性没响应。 代码结构大概是... 司空婷婷 交互 2026-02-03 21:19:35 2 回答 59 浏览 富文本编辑器实时预览样式不同步怎么解决? 用Quill和Vue做可视化编辑器时,实时预览区的样式总比编辑区慢半拍,比如刚改了字体颜色,预览区还是旧样式,卡住好几天了。 尝试过用quill.on('text-change')实时同步内容,但内联... 设计师世玉 交互 2026-02-02 18:51:26
拖动时只存
{ id, oldPos, newPos }这点数据,撤销时反向操作,搞定。