发现点击tabpage的不同页标签,标签页内容没有改变

This commit is contained in:
zqm
2025-11-18 08:46:40 +08:00
parent 0c66be439a
commit b19a0c1a39
2 changed files with 42 additions and 32 deletions

View File

@@ -115,28 +115,7 @@
@tabDragStart="() => {}"
@tabDragMove="() => {}"
@tabDragEnd="() => {}"
>
<!-- 在TabPage内渲染其包含的Panels -->
<Panel
v-for="panel in item.tabPage.panels"
:key="`received-panel-${index}-${panel.id}`"
:id="panel.id"
:title="panel.title"
:collapsed="panel.collapsed"
:toolbarExpanded="panel.toolbarExpanded"
:maximized="panel.maximized"
:content="panel.content"
@toggleCollapse="() => {}"
@maximize="onPanelMaximize"
@close="() => {}"
@toggleToolbar="() => {}"
@dragStart="() => {}"
@dragMove="() => {}"
@dragEnd="() => {}"
@dragover="handleDragOver"
@dragleave="handleDragLeave"
/>
</TabPage>
/>
</template>
</div>
</div>
@@ -593,11 +572,10 @@ const mergeAreaContent = (sourceArea) => {
sourceArea.tabPages.forEach((tabPage, tabIndex) => {
const newTabPageId = `merged-tabpage-${Date.now()}-${tabIndex}`
const newPanels = (tabPage.panels || []).map((panel, panelIndex) => {
const newPanelId = `merged-panel-${Date.now()}-${tabIndex}-${panelIndex}`
console.log(`[Area] 添加Panel: ${panel.id} -> ${newPanelId}`)
// 保持原有Panel ID不变确保Vue响应式和状态稳定性
console.log(`[Area] 添加Panel: ${panel.id}`)
return {
...panel,
id: newPanelId,
maximized: true
}
})
@@ -643,20 +621,18 @@ const mergeAreaContent = (sourceArea) => {
if (sourceArea.tabPages && sourceArea.tabPages.length > 0) {
sourceArea.tabPages.forEach((sourceTabPage, tabIndex) => {
if (sourceTabPage && sourceTabPage.panels) {
// 为每个Panel创建新的唯一ID避免冲突
// 保持原有Panel ID不变避免Vue组件重新创建和状态丢失
const newPanels = sourceTabPage.panels.map((panel, panelIndex) => {
const newPanelId = `merged-panel-${Date.now()}-${tabIndex}-${panelIndex}`
console.log(`[Area] 合并Panel到现有TabPage: ${panel.id} -> ${newPanelId}`)
console.log(`[Area] 合并Panel到现有TabPage: ${panel.id}`)
return {
...panel,
id: newPanelId,
maximized: true
}
})
// 将新的Panel添加到现有TabPage
existingTabPage.tabPage.panels.push(...newPanels)
existingTabPage.panels.push(...newPanels)
// existingTabPage.panels 是旧引用,保持结构一致性但避免重复添加
console.log(`[Area] 成功合并 ${newPanels.length} 个Panel到现有TabPage`)
}

View File

@@ -58,8 +58,41 @@
<!-- Tab页内容区域 -->
<div class="tab-content">
<!-- 渲染slot内容Panel组件 -->
<slot></slot>
<!-- 渲染当前激活的Panel内容 -->
<template v-if="activeTabIndex >= 0 && activeTabIndex < panels.length">
<div
v-for="(panel, index) in panels"
:key="panel.id"
v-show="index === activeTabIndex"
class="tab-panel"
:class="{ active: index === activeTabIndex }"
>
<!-- 使用Panel组件渲染面板内容 -->
<Panel
:id="panel.id"
:title="panel.title"
:x="panel.x || 0"
:y="panel.y || 0"
:width="panel.width || 300"
:height="panel.height || 200"
:collapsed="panel.collapsed || false"
:toolbar-expanded="panel.toolbarExpanded || false"
:maximized="panel.maximized || false"
:content="panel.content"
@toggle-collapse="$emit('toggleCollapse', $event)"
@maximize="$emit('maximize', $event)"
@close="$emit('close', $event)"
@toggle-toolbar="$emit('toggleToolbar', $event)"
@drag-start="$emit('dragStart', $event)"
@drag-move="$emit('dragMove', $event)"
@drag-end="$emit('dragEnd', $event)"
/>
</div>
</template>
<!-- 空状态提示 -->
<div v-else class="tab-empty">
<span>没有可显示的内容</span>
</div>
</div>
<!-- 右侧标签栏 -->
@@ -122,6 +155,7 @@
<script setup>
import { defineProps, defineEmits, ref, onMounted } from 'vue'
import Panel from './Panel.vue'
const props = defineProps({
id: { type: String, required: true },