improve: history stack memory

pr675
Hufe921 2 years ago
parent c6534f766d
commit 5044c31921

@ -62,7 +62,7 @@ import {
WordBreak
} from '../../dataset/enum/Editor'
import { Control } from './control/Control'
import { zipElementList } from '../../utils/element'
import { getSlimCloneElementList, zipElementList } from '../../utils/element'
import { CheckboxParticle } from './particle/CheckboxParticle'
import { DeepRequired, IPadding } from '../../interface/Common'
import {
@ -2059,23 +2059,26 @@ export class Draw {
}
// 历史记录用于undo、redo
if (isSubmitHistory) {
const self = this
const oldElementList = deepClone(this.elementList)
const oldHeaderElementList = deepClone(this.header.getElementList())
const oldFooterElementList = deepClone(this.footer.getElementList())
const { startIndex, endIndex } = this.range.getRange()
const oldElementList = getSlimCloneElementList(this.elementList)
const oldHeaderElementList = getSlimCloneElementList(
this.header.getElementList()
)
const oldFooterElementList = getSlimCloneElementList(
this.footer.getElementList()
)
const oldRange = deepClone(this.range.getRange())
const pageNo = this.pageNo
const oldPositionContext = deepClone(positionContext)
const zone = this.zone.getZone()
this.historyManager.execute(function () {
self.zone.setZone(zone)
self.setPageNo(pageNo)
self.position.setPositionContext(deepClone(oldPositionContext))
self.header.setElementList(deepClone(oldHeaderElementList))
self.footer.setElementList(deepClone(oldFooterElementList))
self.elementList = deepClone(oldElementList)
self.range.setRange(startIndex, endIndex)
self.render({
this.historyManager.execute(() => {
this.zone.setZone(zone)
this.setPageNo(pageNo)
this.position.setPositionContext(deepClone(oldPositionContext))
this.header.setElementList(deepClone(oldHeaderElementList))
this.footer.setElementList(deepClone(oldFooterElementList))
this.elementList = deepClone(oldElementList)
this.range.replaceRange(deepClone(oldRange))
this.render({
curIndex,
isSubmitHistory: false,
isSourceHistory: true

@ -1,4 +1,11 @@
import { cloneProperty, deepClone, getUUID, isArrayEqual, splitText } from '.'
import {
cloneProperty,
deepClone,
deepCloneOmitKeys,
getUUID,
isArrayEqual,
splitText
} from '.'
import {
ElementType,
IEditorOption,
@ -28,6 +35,7 @@ import {
} from '../dataset/constant/Title'
import { ControlComponent, ControlType } from '../dataset/enum/Control'
import { DeepRequired } from '../interface/Common'
import { IRowElement } from '../interface/Row'
import { ITd } from '../interface/table/Td'
import { ITr } from '../interface/table/Tr'
@ -1169,3 +1177,10 @@ export function getTextFromElementList(elementList: IElement[]) {
}
return buildText(zipElementList(elementList))
}
export function getSlimCloneElementList(elementList: IElement[]) {
return deepCloneOmitKeys<IElement[], IRowElement>(elementList, [
'metrics',
'style'
])
}

@ -31,6 +31,23 @@ export function throttle(func: Function, delay: number) {
}
}
export function deepCloneOmitKeys<T, K>(obj: T, omitKeys: (keyof K)[]): T {
if (!obj || typeof obj !== 'object') {
return obj
}
let newObj: any = {}
if (Array.isArray(obj)) {
newObj = obj.map(item => deepCloneOmitKeys(item, omitKeys))
} else {
// prettier-ignore
(Object.keys(obj) as (keyof K)[]).forEach(key => {
if (omitKeys.includes(key)) return
return (newObj[key] = deepCloneOmitKeys((obj[key as unknown as keyof T] ), omitKeys))
})
}
return newObj
}
export function deepClone<T>(obj: T): T {
if (!obj || typeof obj !== 'object') {
return obj
@ -39,8 +56,8 @@ export function deepClone<T>(obj: T): T {
if (Array.isArray(obj)) {
newObj = obj.map(item => deepClone(item))
} else {
Object.keys(obj as any).forEach(key => {
// @ts-ignore
// prettier-ignore
(Object.keys(obj) as (keyof T)[]).forEach(key => {
return (newObj[key] = deepClone(obj[key]))
})
}

Loading…
Cancel
Save