From 44c730960852bbe6e5fb7b10d326c23b9052869b Mon Sep 17 00:00:00 2001 From: WangLeo <690854599@qq.com> Date: Tue, 5 May 2026 19:44:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B1=8F=E5=B9=95=E6=94=BE?= =?UTF-8?q?=E5=A4=A7=E6=97=B6=E8=99=9A=E6=8B=9F=E6=BB=9A=E5=8A=A8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B4=E4=BD=93=E5=AE=BD=E5=BA=A6=E5=8F=AF=E8=87=AA=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 4 +- src/components/dialogBox/index.vue | 3 +- .../VirtualScroller copy 2.vue | 793 ++++++++++-------- .../VirtualScroller copy 3.vue | 615 ++++++++++++++ .../virtual-scroller/VirtualScroller.vue | 41 +- src/style.css | 2 +- src/views/home/display/components/set.vue | 31 +- 7 files changed, 1147 insertions(+), 342 deletions(-) create mode 100644 src/components/virtual-scroller/VirtualScroller copy 3.vue diff --git a/components.d.ts b/components.d.ts index 393e90d..ed64dd7 100644 --- a/components.d.ts +++ b/components.d.ts @@ -11,9 +11,7 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { - 2: typeof import('./src/components/virtual-scroller/VirtualScroller copy 2.vue')['default'] Canvas: typeof import('./src/components/canvas/index.vue')['default'] - copy: typeof import('./src/components/virtual-scroller/VirtualScroller copy.vue')['default'] DialogBox: typeof import('./src/components/dialogBox/index.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] @@ -21,6 +19,7 @@ declare module 'vue' { ElUpload: typeof import('element-plus/es')['ElUpload'] IEpCalendar: typeof import('~icons/ep/calendar')['default'] IEpClose: typeof import('~icons/ep/close')['default'] + IEpDocumentCopy: typeof import('~icons/ep/document-copy')['default'] IEpLoading: typeof import('~icons/ep/loading')['default'] IEpPlus: typeof import('~icons/ep/plus')['default'] IEpStar: typeof import('~icons/ep/star')['default'] @@ -39,5 +38,6 @@ declare module 'vue' { VirtualScroller: typeof import('./src/components/virtual-scroller/VirtualScroller.vue')['default'] 'VirtualScroller copy': typeof import('./src/components/virtual-scroller/VirtualScroller copy.vue')['default'] 'VirtualScroller copy 2': typeof import('./src/components/virtual-scroller/VirtualScroller copy 2.vue')['default'] + 'VirtualScroller copy 3': typeof import('./src/components/virtual-scroller/VirtualScroller copy 3.vue')['default'] } } diff --git a/src/components/dialogBox/index.vue b/src/components/dialogBox/index.vue index da4120e..f86e29c 100644 --- a/src/components/dialogBox/index.vue +++ b/src/components/dialogBox/index.vue @@ -312,7 +312,8 @@ onMounted(async () => { diff --git a/src/components/virtual-scroller/VirtualScroller.vue b/src/components/virtual-scroller/VirtualScroller.vue index 55f5a2b..1a94268 100644 --- a/src/components/virtual-scroller/VirtualScroller.vue +++ b/src/components/virtual-scroller/VirtualScroller.vue @@ -316,7 +316,7 @@ const measureItem = (index, element) => { const firstChild = element.firstElementChild const targetElement = firstChild || element - const height = targetElement.getBoundingClientRect().height + const height = Math.ceil(targetElement.offsetHeight) if (height > 0) { const cachedHeight = itemHeights.value.get(index) @@ -506,6 +506,7 @@ watch(() => computedData.value, (newData, oldData) => { watch(visibleItems, (newItems) => { nextTick(() => { observeVisibleItems() + cleanupExtraItems(newItems) }) if (newItems.length > 0) { const firstItem = newItems[0] @@ -514,6 +515,43 @@ watch(visibleItems, (newItems) => { } }, { deep: true }) +const cleanupExtraItems = (visibleItems) => { + if (!itemRefs.size || !visibleItems.length) return + + const visibleIndices = new Set(visibleItems.map(item => item.index)) + const existingIndices = Array.from(itemRefs.keys()).sort((a, b) => a - b) + + const toRemove = [] + let lastValidIndex = -1 + + for (const index of existingIndices) { + if (visibleIndices.has(index)) { + if (lastValidIndex !== -1 && index !== lastValidIndex + 1) { + for (let i = lastValidIndex + 1; i < index; i++) { + if (itemRefs.has(i)) { + toRemove.push(i) + } + } + } + lastValidIndex = index + } else { + toRemove.push(index) + } + } + + for (const index of toRemove) { + const element = itemRefs.get(index) + if (element && element.parentNode) { + element.parentNode.removeChild(element) + } + itemRefs.delete(index) + } + + if (toRemove.length > 0) { + console.log(`清理了 ${toRemove.length} 个多余项目:`, toRemove) + } +} + onMounted(() => { setupResizeObserver() isInitialized.value = true @@ -526,6 +564,7 @@ onMounted(() => { } observeVisibleItems() + cleanupExtraItems(visibleItems.value) }) }) diff --git a/src/style.css b/src/style.css index 98cbd70..f62d7b9 100644 --- a/src/style.css +++ b/src/style.css @@ -22,7 +22,7 @@ body { margin: 0; width: 100%; height: 100vh; - min-width: 1500px; + min-width: 1300px; /* min-height: 960px; */ overflow-y: hidden; } diff --git a/src/views/home/display/components/set.vue b/src/views/home/display/components/set.vue index 6c91529..f2acb22 100644 --- a/src/views/home/display/components/set.vue +++ b/src/views/home/display/components/set.vue @@ -4,8 +4,11 @@
-
- {{ props.item.generateData.prompt || '生成图片' }} +
+ + {{ props.item.generateData.prompt || '生成图片' }} + +
{{ props.item.generateData.model }}
{{ props.item.generateData.proportion }}
@@ -286,15 +289,25 @@ const addCollection = async (url) => { ElMessage.error('收藏操作失败') } } + +const copyPrompt = async () => { + try { + const promptText = props.item.generateData.prompt || '生成图片' + await navigator.clipboard.writeText(promptText) + ElMessage.success('提示词已复制到剪贴板') + } catch (error) { + console.error('复制失败:', error) + ElMessage.error('复制失败,请手动复制') + } +}