|
|
@@ -319,17 +319,14 @@ function addElementIdentifiers(svgData, keys) {
|
|
|
// 确保group有属性对象
|
|
|
if (!group.$) group.$ = {};
|
|
|
|
|
|
- // 添加唯一标识
|
|
|
- group.$['data-anim-id'] = elementId;
|
|
|
-
|
|
|
- // 保存初始transform
|
|
|
- const transform = group.$.transform || '';
|
|
|
+ // 添加唯一标识,同时该标识应支持组件索引以免多个组件复用后动画元素定位错误
|
|
|
+ group.$[':data-anim-id'] = `\`${elementId}\${identify}\``;
|
|
|
|
|
|
// 存储元素信息
|
|
|
elementInfoMap.set(elementId, {
|
|
|
key,
|
|
|
- initialTransform: transform,
|
|
|
transforms: [], // 将在后续步骤填充
|
|
|
+ opacity: [],
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
@@ -369,6 +366,7 @@ async function collectTransforms(workspaceDir, files, elementInfoMap) {
|
|
|
// 为每个元素初始化transform序列
|
|
|
for (const [elementId, info] of elementInfoMap) {
|
|
|
info.transforms = [];
|
|
|
+ info.opacity = [];
|
|
|
}
|
|
|
|
|
|
// 按顺序处理所有SVG文件
|
|
|
@@ -385,10 +383,9 @@ async function collectTransforms(workspaceDir, files, elementInfoMap) {
|
|
|
const elementIndex = parseInt(elementId.split('_').pop());
|
|
|
if (groups[elementIndex] && groups[elementIndex].$ && groups[elementIndex].$.transform) {
|
|
|
info.transforms.push(groups[elementIndex].$.transform);
|
|
|
- } else {
|
|
|
- // 如果找不到transform,使用前一个值或初始值
|
|
|
- const lastTransform = info.transforms.length > 0 ? info.transforms[info.transforms.length - 1] : info.initialTransform;
|
|
|
- info.transforms.push(lastTransform);
|
|
|
+ }
|
|
|
+ if (groups[elementIndex] && groups[elementIndex].$ && groups[elementIndex].$.opacity) {
|
|
|
+ info.opacity.push(groups[elementIndex].$.opacity);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -407,14 +404,18 @@ function generateVueComponent(svgContent, elementInfoMap, keys) {
|
|
|
return `
|
|
|
<template>\n${svgContent}\n</template>\n\n
|
|
|
<script setup lang="ts">
|
|
|
-import { onMounted, defineExpose } from "vue";
|
|
|
+import { onMounted, defineExpose, withDefaults, defineProps } from "vue";
|
|
|
import { useSvgAnimation } from '/@/hooks/vent/useSvgAnimation';
|
|
|
|
|
|
+const props = withDefaults(defineProps<{
|
|
|
+ /** 组件唯一标识符,提供后可以确保多个组件复用时的元素定位依旧准确 */
|
|
|
+ identify?: string;
|
|
|
+}>(), { identify: '' })
|
|
|
|
|
|
// 元素信息(常量数据,使用Map)
|
|
|
const elementInfo = new Map([
|
|
|
${Array.from(elementInfoMap.entries())
|
|
|
- .map(([key, value]) => ` ["${key}", ${JSON.stringify(value)}]`)
|
|
|
+ .map(([key, value]) => `[\`${key}\${props.identify}\`, ${JSON.stringify(value)}]`)
|
|
|
.join(',\n')}
|
|
|
]);
|
|
|
|