当前位置: 首页 > news >正文

jn建站系统启动互联全网营销推广

jn建站系统,启动互联全网营销推广,网站的建设参考文献,找做废薄膜网站基于vue3实现画布操作的撤销与重做 前言 vue3项目中实现在canvas画布上实现画节点和连线功能,要求可以撤销重做 思路 canvasBox 画板数据是存放在对象里面; snapshots存放操作记录; curIndex表示当前操作索引的下标; maxLimit表…

基于vue3实现画布操作的撤销与重做

前言
vue3项目中实现在canvas画布上实现画节点和连线功能,要求可以撤销重做

思路
canvasBox 画板数据是存放在对象里面;
snapshots存放操作记录;
curIndex表示当前操作索引的下标;
maxLimit表示最大保存的历史记录次数;
isSnapshot是否要生成快照,作用是防止撤销重做的时候也会添加快照,触发存储操作;

保存操作记录:
在移动节点、新建节点、删除节点、缩放节点、编辑节点属性、操作连线等操作时触发watch监听canvasBox画布数据变化,如果变化并且和前一次操作步骤不同,则推入历史记录;如果超过最大保存次数,则删除最开始记录,push最新记录。

撤销操作:
判断是否达到数组下限,如果为0,直接返回,否则就从当前下标的上一个取数据,按照获取的数据,重新绘制画布。

重做操作:
判断是否达到数组上限,如果达到,直接返回,否则从当前下标的下一个取数据,按照获取的数据,重新绘制画布。

实现代码
第一步:定义画布数据,定义数据快照数据

  //画板数据是存放在 canvasBox 对象const canvasBox = ref([] as any);//数据快照技术, 移动元素/新建元素/删除元素/缩放元素/编辑元素属性const recordManager = reactive({snapshots: [], //操作记录的集合curIndex: 0, //当前操作索引的下标maxLimit: 50, //最大保存的历史记录数isSnapshot: true, //是否要生成快照(isSnapshot),作用是防止撤销重做的时候也会添加快照})

第二步:监听画布数据,实现存储历史记录

const pushRecordFn = (state: {},prevState: {},
) => {const {snapshots, maxLimit, curIndex} = recordManager;//如果两个状态相同,则不推入历史记录if (!diff(state, snapshots[curIndex])) {return;}//如果在撤销的过程中重新执行了新的操作,则覆盖上一个状态if (snapshots.length - 1 !== curIndex) {snapshots.splice(curIndex + 1, snapshots.length);}//超过了最大记录if (snapshots.length >= maxLimit) {snapshots.shift();}if(recordManager.isSnapshot){//是否生成快照recordManager.snapshots.push(cloneDeep(state));recordManager.curIndex = recordManager.snapshots.length - 1;console.log("更新操作记录器", recordManager.snapshots);}
}
//对监听进行防抖优化( 移动元素等时候高频操作, 对性能开销相对较大) // 
// debounce,cloneDeep需要引入 import {debounce, cloneDeep} from "lodash";
watch(canvasBox, debounce(pushRecordFn, 300), {deep: true});//判断前后状态是否相同
const diff = (prev:any, next: any) => {let result = false;try{const prevCopy = JSON.stringify(prev);const nextCopy = JSON.stringify(next);result = prevCopy  !== nextCopy ;}catch(err) {console.log(err)}return result
}

第三步:撤销

const handleUndo = () => {const {snapshots, maxLimit, curIndex} = recordManager;//如果达到下限, 直接返回if (curIndex === 0) return;recordManager.isSnapshot = false;recordManager.curIndex--;canvasBox.value = 	cloneDeep(recordManager.snapshots[recordManager.curIndex]);// console.log("撤销", canvasBox.value);//重绘(需要根据项目自定义drawCanvas方法)drawCanvas(canvasBox.value);}

第四步: 重做

const handleRedo = () => {// console.log("重做");const {snapshots, maxLimit, curIndex} = recordManager;//如果达到上限,直接返回if (curIndex >= snapshots.length - 1) return;recordManager.isSnapshot = false;recordManager.curIndex++;canvasBox.value = cloneDeep(recordManager.snapshots[recordManager.curIndex]);//重绘(需要根据项目自定义drawCanvas方法)drawCanvas(canvasBox.value);}
http://www.tj-hxxt.cn/news/16721.html

相关文章:

  • 沈阳盘古网络做网站做的好么做网站公司排名
  • 南昌建站推广公司沧州网络推广公司
  • 腾讯的网站建设用了多少钱yw77731域名查询
  • 做的美食视频网站福建seo学校
  • 网站上做销售网点怎么做网站域名购买
  • 网站做零售百度移动端优化
  • 网站制作网页设计企业seo优化服务
  • 网站设计中 查询怎么做百度人工服务电话
  • wordpress去除category海南seo快速排名优化多少钱
  • 网站升级改造建设方案百度小程序关键词优化
  • 做网站的公司怎么赚钱seo策划
  • 网站备案法律法规典型十大优秀网络营销案例
  • 专注赣州网站建设如何设计网站的首页
  • 深圳企业网站建设公司排名编程培训
  • 网站可以增加关键词吗如何建立一个自己的网站?
  • 长春财经学院占地面积家居seo整站优化方案
  • 如何在网站上做背景图片怎么做裤子seo关键词
  • 分销平台有哪些?廊坊seo培训
  • 苏州建设交通职业技术学院短视频seo推广隐迅推专业
  • 哪里可以做虚拟货币网站网站推广软件下载安装免费
  • 微信代运营协议优化网站最好的刷排名软件
  • 慈云寺网站建设线上平台推广方式
  • 编辑网站的软件爱站网seo工具包
  • 手机版的网站用什么开发免费s站推广网站
  • asp网站开发国内外现状怎样查询百度收录和排名情况
  • 凡科互动游戏怎么修改程序昆明百度搜索排名优化
  • 音乐网站怎么做社交的长沙专业seo优化公司
  • 做个网站需要学会什么龙岗网站推广
  • php网站开发实战视频教程如何做平台推广赚钱
  • 王者荣耀网页制作素材潍坊seo计费