vue+TS+(vue-gird-layout)简单实现撤销功能

公司业务,使用vue-gird-layout实现能够添加模块等各种字段,可以对字段进行修改大小和位置,达到做出PDF,现要求实现撤销到上一步,主要是对数据的处理操作。数据结构算法思想很有必要学习

实现技巧:主要使用两个数组进行保存数据,一个是保存历史状态,,一个是保存现阶段操作老的状态

注意点⚠️:存储数组数据的时候必须要使用JSON.parse(JSON.stringify(data)),不然存储的数据会覆盖上一个数组

<el-button @click="backOut" :disabled="BackShow">撤销</el-button>
---------------------------------------------------------------------------------
<grid-layout
	:layout="layoutData"
	:col-num="1008"
	:row-height="rowHeight"
	:is-draggable="draggable"
	:is-resizable="true"
	:is-mirrored="false"
	:vertical-compact="false"
	:margin="[0, 0]"
	:use-css-transforms="false"
	:prevent-collision="true"
	@layout-created="layoutCreatedEvent"
	@resized="resizedEvent"
	>
	    <grid-item
	      v-for="item in layoutData"
	      :key="item.i"
	      :x="item.x"
	      :y="item.y"
	      :w="item.w"
	      :h="item.h"
	      :i="item.i"
	      @moved="movedEvent">
	      <div @click="showDetailDialog(item)">
            // 动态控制修改item的属性
          </div>
	    <grid-item>
</grid-layout>
---------------------------------------------------------------------------------------
// 定义页面里面的数据
layoutData:[] //当前页面所有的字段的状态
private historyLayOutData: any = [] // 存储历史数据
private nowLayoutData: any = [] //存储已经保存的数据 
// 点击的时候能拿到item
showDetailDialog(item){}

//gird-layout初始化事件
layoutCreatedEvent(){}

// 在获取layout界面元素时 初始化historyLayOutData和将界面数据赋值给nowLayoutData
this.nowLayoutData = JSON.parse(JSON.stringify(this.layoutData))
this.historyLayOutData = []

// layout- item  移动完成触发
// 1.移动的完成,将之前存储的nowLayoutData  push到历史数据中 
// 2.然后再将移动完的新数据存储到nowLayoutData中
// **相当于备份了前一步的操作数据**
movedEvent(){
 this.historyLayOutData.push(JSON.parse(JSON.stringify(this.nowLayoutData)))
 this.nowLayoutData = (JSON.parse(JSON.stringify(this.layoutData))) 
}

// 改变大小 和移动位置一样
resizedEvent() {
  this.historyLayOutData.push(JSON.parse(JSON.stringify(this.oldLayoutData)))
  this.oldLayoutData = (JSON.parse(JSON.stringify(this.layoutData)))
}


// 撤销按钮
// 1.从历史数据(也就是上一步的全部数据,这个数据的最后一步相当于前一步操作的位置)中取出最后一步赋值给本页数据(完成撤销操作)
// 2.然后将撤销完成的数据保存到已完成移动的当前数据中
// 3.然后将历史数据中的最后一步删除,因为历史数据始终要保持,是当前操作的前一步操作,所以要删除最后一步(当前的一步)
backOut() {
  this.layoutData = this.historyLayOutData[this.historyLayOutData.length - 1]
  this.nowLayoutData = JSON.parse(JSON.stringify(this.layoutData))
  this.historyLayOutData.pop()
}

在这里插入图片描述

vue-grid-layout插件(APi):https://jbaysolutions.github.io/vue-grid-layout/zh/guide/


多页打印样式会错乱,已解决,将最外层的layout动态绑定一个空数组即可
请添加图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值