iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么用Immutable.js实现撤销重做功能
  • 789
分享到

怎么用Immutable.js实现撤销重做功能

2024-04-02 19:04:59 789人浏览 薄情痞子
摘要

这篇文章主要介绍了怎么用Immutable.js实现撤销重做功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Immutable.js实现撤销重做功能文章都会有所收获,下

这篇文章主要介绍了怎么用Immutable.js实现撤销重做功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Immutable.js实现撤销重做功能文章都会有所收获,下面我们一起来看看吧。

第一步:确定哪些状态需要历史记录,创建自定义的 State 类

并非所有的状态都需要历史记录。许多状态是非常琐碎的,尤其是一些与鼠标或者键盘交互相关的状态,例如在画图工具中拖拽一个图形时我们需要设置一个「正在进行拖拽」的标记,页面会根据该标记显示对应的拖拽提示,显然该拖拽标记不应该出现在历史记录中;而另一些状态无法被撤销或是不需要被撤销,例如网页窗口大小,向后台发送过的请求列表等。

排除那些不需要历史记录的状态,我们将剩下的状态用 Immutable Record 封装起来,并定义 State 类:

// State.ts

import { Record, List, Set } from 'immutable'

const StateRecord = Record({

  items: List<Item>

  transfORM: d3.ZoomTransform

  selection: number

})

// 用类封装,便于书写 typescript,注意这里最好使用Immutable 4.0 以上的版本

export default class State extends StateRecord {}

这里我们的例子是一个简易的在线画图工具,所以上面的 State 类中包含了三个字段,items 用来记录已经绘制的图形,transform 用来记录画板的平移和缩放状态,selection 则表示目前选中的图形的 ID。而画图工具中的其他状态,例如图形绘制预览,自动对齐配置,操作提示文本等,则没有放在 State 类中。

第二步:定义 Action 基类,并为每种不同的操作创建对应的 Action 子类

与 redux-undo 不同的是,我们仍然采用命令模式:定义基类 Action,所有对 State 的操作都被封装为一个 Action 的实例;定义若干 Action 的子类,对应于不同类型的操作。

在 TypeScript 中,Action 基类用 Abstract Class 来定义比较方便。

// actions/index.ts

export default abstract class Action {

  abstract next(state: State): State

  abstract prev(state: State): State

  prepare(appHistory: AppHistory): AppHistory { return appHistory }

  getMessage() { return this.constructor.name }

}

Action 对象的 next 方法用来计算「下一个状态」,prev 方法用来计算「上一个状态」。getMessage 方法用来获取 Action 对象的简短描述。通过 getMessage 方法,我们可以将用户的操作记录显示在页面上,让用户更方便地了解最近发生了什么。prepare 方法用来在 Action 第一次被应用之前,使其「准备好」,AppHistory 的定义在本文后面会给出。

Action 子类举例

下面的 AddIteMaction 是一个典型的 Action 子类,用于表达「添加一个新的图形」。

// actions/AddItemAction.ts

export default class AddItemAction extends Action {

  newItem: Item

  prevSelection: number

  constructor(newItem: Item) {

    super()

    this.newItem = newItem

  }

  prepare(history: AppHistory) {

    // 创建新的图形后会自动选中该图形,为了使得撤销该操作时 state.selection 变为原来的值

    // prepare 方法中读取了「添加图形之前 selection 的值」并保存到 this.prevSelection

    this.prevSelection = history.state.selection

    return history

  }

  next(state: State) {

    return state

      .setIn(['items', this.newItem.id], this.newItem)

      .set('selection', this.newItemId)

  }

  prev(state: State) {

    return state

      .deleteIn(['items', this.newItem.id])

      .set('selection', this.prevSelection)

  }

  getMessage() { return &mdash;&mdash;Add item ${this.newItem.id}&mdash;&mdash; }

}

运行时行为

应用运行时,用户交互产生一个 Action 流,每次产生 Action 对象时,我们调用该对象的 next 方法来计算后一个状态,然后将该 action 保存到一个列表中以备后用;用户进行撤销操作时,我们从 action 列表中取出最近一个 Action 并调用其 prev 方法。应用运行时,next/prev 方法被调用的情况大致如下:

// initState 是一开始就给定的应用初始状态

// 某一时刻,用户交互产生了 action1 ...

state1 = action1.next(initState)

// 又一个时刻,用户交互产生了 action2 ...

state2 = action2.next(state1)

// 同样的,action3也出现了 ...

state3 = action3.next(state2)

// 用户进行撤销,此时我们需要调用最近一个action的prev方法

state4 = action3.prev(state3)

// 如果再次进行撤销,我们从action列表中取出对应的action,调用其prev方法

state5 = action2.prev(state4)

// 重做的时候,取出最近一个被撤销的action,调用其next方法

state6 = action2.next(state5)

Applied-Action

为了方便后面的说明,我们对 Applied-Action 进行一个简单的定义:Applied-Action 是指那些操作结果已经反映在当前应用状态中的 action;当 action 的 next 方法执行时,该 action 变为 applied;当 prev 方法被执行时,该 action 变为 unapplied。

关于“怎么用Immutable.js实现撤销重做功能”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用Immutable.js实现撤销重做功能”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网VUE频道。

--结束END--

本文标题: 怎么用Immutable.js实现撤销重做功能

本文链接: https://www.lsjlt.com/news/93601.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Immutable.js实现撤销重做功能
    这篇文章主要介绍了怎么用Immutable.js实现撤销重做功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Immutable.js实现撤销重做功能文章都会有所收获,下...
    99+
    2022-10-19
  • C++实现自定义撤销重做功能的示例代码
    目录前言一、完整代码二、使用示例1、基本用法2、gdi画线撤销总结前言 在使用c++做界面开发的时候,需要涉及到到撤销重做操作,尤其是实现白板功能时需要自己实现一套撤销重做功能,如果...
    99+
    2022-12-15
    C++自定义撤销重做功能 C++撤销重做功能 C++撤销重做
  • C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能
    .Net为我们提供了众多的泛型集合。比如,Stack<T>先进后出,Queue<T>先进先出,List<T>集合元素可排序,支持索引,Linked...
    99+
    2022-11-13
    C# 泛型容器 Stack<T> 撤销功能 重做功能
  • 怎么用C++实现推箱子功能附加回撤
    本篇内容介绍了“怎么用C++实现推箱子功能附加回撤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编码环境:VS2019 利用 链栈...
    99+
    2023-06-25
  • 怎么用Python代码实现微信消息撤回捕捉功能
    本篇内容介绍了“怎么用Python代码实现微信消息撤回捕捉功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,模块介绍首先的话要实现消息撤...
    99+
    2023-06-16
  • JavaScript怎么实现重置功能
    这篇文章主要介绍“JavaScript怎么实现重置功能”,在日常操作中,相信很多人在JavaScript怎么实现重置功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java...
    99+
    2022-10-19
  • Android用SharedPreferences怎么实现登录注册注销功能
    这篇“Android用SharedPreferences怎么实现登录注册注销功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-06-30
  • PHP中怎么实现重定向功能
    今天就跟大家聊聊有关PHP中怎么实现重定向功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。PHP重定向代码:< phpfunction redirect($url, $del...
    99+
    2023-06-17
  • 利用servlet怎么实现一个重定向功能
    这期内容当中小编将会给大家带来有关利用servlet怎么实现一个重定向功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.重定向是什么?  这里说的重定向是由http协议规定的一种机制。其工作流程如下所...
    99+
    2023-05-31
    servlet
  • 怎么在JavaWeb中利用Session实现一个用户登陆注销功能
    今天就跟大家聊聊有关怎么在JavaWeb中利用Session实现一个用户登陆注销功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Cookie:cookie是客户端技术,程序把每个用...
    99+
    2023-05-30
    javaweb session
  • 怎么使用Spring注解实现循环重试功能
    这篇文章主要介绍“怎么使用Spring注解实现循环重试功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Spring注解实现循环重试功能”文章能帮助大家解决问题。一、@Retryable是什...
    99+
    2023-07-05
  • Golang怎么使用Map实现去重与set的功能
    这篇文章将为大家详细讲解有关Golang怎么使用Map实现去重与set的功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二...
    99+
    2023-06-14
  • 云服务器怎么做端口映射功能的实现
    端口映射可以为云服务器的多个客户端提供访问同一个云服务器资源的途径。例如,一个云服务器可以将某个客户端的PHP端口映射到另一个PHP端口,从而使一个PHP客户端可以通过该PHP客户端访问同一个云服务器的其他应用程序。另外,一个云服务器可以将...
    99+
    2023-10-27
    怎么做 端口映射 功能
  • ElementUI怎么实现el-form表单重置功能按钮
    这篇文章主要介绍“ElementUI怎么实现el-form表单重置功能按钮”,在日常操作中,相信很多人在ElementUI怎么实现el-form表单重置功能按钮问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”E...
    99+
    2023-06-20
  • 怎么用vbs实现zip功能
    小编给大家分享一下怎么用vbs实现zip功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!压缩:  Function fZip(sSource...
    99+
    2023-06-08
  • 怎么用vbs实现cmd功能
    本篇内容介绍了“怎么用vbs实现cmd功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!on error resume&...
    99+
    2023-06-08
  • 怎么在Android中实现一个双重选择框功能
    这期内容当中小编将会给大家带来有关怎么在Android中实现一个双重选择框功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原理:定义四个RadioGroup,通过第一个RadioGroup的选择来控制其...
    99+
    2023-05-30
    android
  • 怎么用java实现打印功能
    要使用Java实现打印功能,可以使用Java的打印API来完成。下面是一个简单的示例代码,演示了如何使用Java打印API实现打印功...
    99+
    2023-10-24
    java
  • 怎么使用redis实现session功能
    这篇文章主要介绍怎么使用redis实现session功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们来简单介绍下redis。Redis(Remote Dictionary Se...
    99+
    2022-10-18
  • 怎么用AJAX实现分页功能
    本篇内容主要讲解“怎么用AJAX实现分页功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用AJAX实现分页功能”吧!需要最新版本的bingo.js支持,下...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作