当前位置:首页 > JavaScript

js 实现恢复

2026-04-05 16:10:53JavaScript

JavaScript 实现恢复功能

撤销与恢复的基本原理

撤销和恢复功能通常基于命令模式或状态快照实现。命令模式记录操作历史,状态快照保存应用状态的副本。

命令模式示例:

class Command {
  constructor(execute, undo) {
    this.execute = execute;
    this.undo = undo;
  }
}

状态快照示例:

const history = [];
let currentState = 0;

实现撤销/恢复栈

维护两个栈结构分别存储撤销和恢复的操作:

js 实现恢复

const undoStack = [];
const redoStack = [];

function executeCommand(command) {
  command.execute();
  undoStack.push(command);
  redoStack.length = 0; // 清空重做栈
}

撤销操作实现

function undo() {
  if (undoStack.length === 0) return;

  const command = undoStack.pop();
  command.undo();
  redoStack.push(command);
}

恢复操作实现

function redo() {
  if (redoStack.length === 0) return;

  const command = redoStack.pop();
  command.execute();
  undoStack.push(command);
}

完整示例代码

class TextEditor {
  constructor() {
    this.text = '';
    this.undoStack = [];
    this.redoStack = [];
  }

  insert(str) {
    const prevText = this.text;
    this.text += str;

    this.undoStack.push({
      execute: () => this.text = prevText,
      undo: () => this.text = prevText + str
    });

    this.redoStack.length = 0;
  }

  undo() {
    if (this.undoStack.length === 0) return;

    const action = this.undoStack.pop();
    action.execute();
    this.redoStack.push(action);
  }

  redo() {
    if (this.redoStack.length === 0) return;

    const action = this.redoStack.pop();
    action.undo();
    this.undoStack.push(action);
  }
}

优化建议

  1. 限制历史记录数量防止内存问题
  2. 使用不可变数据结构提升性能
  3. 考虑使用专业库如Redux-undo

实际应用场景

  1. 文本编辑器
  2. 绘图应用
  3. 电子表格
  4. 任何需要修改历史记录的应用

注意事项

  1. 确保操作是幂等的
  2. 处理并发操作的情况
  3. 考虑操作合并的可能性
  4. 注意内存使用情况

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…