diff --git a/src/hooks/useAddSlidesOrElements.ts b/src/hooks/useAddSlidesOrElements.ts index 2ff2505e..5666b29c 100644 --- a/src/hooks/useAddSlidesOrElements.ts +++ b/src/hooks/useAddSlidesOrElements.ts @@ -2,7 +2,7 @@ import { storeToRefs } from 'pinia' import { nanoid } from 'nanoid' import { useSlidesStore, useMainStore } from '@/store' import { PPTElement, Slide } from '@/types/slides' -import { createElementIdMap } from '@/utils/element' +import { createSlideIdMap, createElementIdMap } from '@/utils/element' import useHistorySnapshot from '@/hooks/useHistorySnapshot' export default () => { @@ -42,12 +42,24 @@ export default () => { * @param slide 页面数据 */ const addSlidesFromData = (slides: Slide[]) => { + const slideIdMap = createSlideIdMap(slides) const newSlides = slides.map(slide => { const { groupIdMap, elIdMap } = createElementIdMap(slide.elements) for (const element of slide.elements) { element.id = elIdMap[element.id] if (element.groupId) element.groupId = groupIdMap[element.groupId] + + // 若元素绑定了页面跳转链接 + if (element.link && element.link.type === 'slide') { + + // 待添加页面中包含该页面,则替换相关绑定关系 + if (slideIdMap[element.link.target]) { + element.link.target = slideIdMap[element.link.target] + } + // 待添加页面中不包含该页面,则删除该元素绑定的页面跳转 + else delete element.link + } } // 动画id替换 if (slide.animations) { @@ -58,7 +70,7 @@ export default () => { } return { ...slide, - id: nanoid(10), + id: slideIdMap[slide.id], } }) slidesStore.addSlide(newSlides) diff --git a/src/utils/element.ts b/src/utils/element.ts index f1646f44..5937b19d 100644 --- a/src/utils/element.ts +++ b/src/utils/element.ts @@ -1,6 +1,6 @@ import tinycolor from 'tinycolor2' import { nanoid } from 'nanoid' -import { PPTElement, PPTLineElement } from '@/types/slides' +import { PPTElement, PPTLineElement, Slide } from '@/types/slides' interface RotatedElementData { left: number @@ -152,6 +152,19 @@ export const uniqAlignLines = (lines: AlignLine[]) => { return uniqLines } +/** + * 以页面列表为基础,为每一个页面生成新的ID,并关联到旧ID形成一个字典 + * 主要用于页面元素时,维持数据中各处页面ID原有的关系 + * @param slides 页面列表 + */ +export const createSlideIdMap = (slides: Slide[]) => { + const slideIdMap = {} + for (const slide of slides) { + slideIdMap[slide.id] = nanoid(10) + } + return slideIdMap +} + /** * 以元素列表为基础,为每一个元素生成新的ID,并关联到旧ID形成一个字典 * 主要用于复制元素时,维持数据中各处元素ID原有的关系