0%

使用vuex和immutable实现undo和redo

使用Vuex实现undo

在最近的一个项目里需要在一个基于canvas进行标注的页面实现用户的撤销操作,刚开始查资料,有介绍可以使用immutable.js来实现。

什么是immutable.js

immutable.js就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。

设计过程

看介绍,immutable很厉害,但是这个是与React搭配可以发挥最大价值的武器,在网上搜索一番,也没有找到配合Vuex使用的例子。所以,最后实现undo还是只能采用普通的array方法。

简单一点就是,每一次标注动作完成后程序都会执行push操作,把标注动作最后的状态push到状态快照数组内,而执行undo其实就是取出pop出最后一次状态的数据,重新赋值给canvas绘制函数,当页面绘制出上一个状态时,也就完成了一次undo操作。

遇到的问题

当执行一次undo时,这次操作要不要再推送到状态快照数组内,这里实际上涉及到是否实现redo功能。