发现点击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="() => {}" @tabDragStart="() => {}"
@tabDragMove="() => {}" @tabDragMove="() => {}"
@tabDragEnd="() => {}" @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> </template>
</div> </div>
</div> </div>
@@ -593,11 +572,10 @@ const mergeAreaContent = (sourceArea) => {
sourceArea.tabPages.forEach((tabPage, tabIndex) => { sourceArea.tabPages.forEach((tabPage, tabIndex) => {
const newTabPageId = `merged-tabpage-${Date.now()}-${tabIndex}` const newTabPageId = `merged-tabpage-${Date.now()}-${tabIndex}`
const newPanels = (tabPage.panels || []).map((panel, panelIndex) => { const newPanels = (tabPage.panels || []).map((panel, panelIndex) => {
const newPanelId = `merged-panel-${Date.now()}-${tabIndex}-${panelIndex}` // 保持原有Panel ID不变确保Vue响应式和状态稳定性
console.log(`[Area] 添加Panel: ${panel.id} -> ${newPanelId}`) console.log(`[Area] 添加Panel: ${panel.id}`)
return { return {
...panel, ...panel,
id: newPanelId,
maximized: true maximized: true
} }
}) })
@@ -643,20 +621,18 @@ const mergeAreaContent = (sourceArea) => {
if (sourceArea.tabPages && sourceArea.tabPages.length > 0) { if (sourceArea.tabPages && sourceArea.tabPages.length > 0) {
sourceArea.tabPages.forEach((sourceTabPage, tabIndex) => { sourceArea.tabPages.forEach((sourceTabPage, tabIndex) => {
if (sourceTabPage && sourceTabPage.panels) { if (sourceTabPage && sourceTabPage.panels) {
// 为每个Panel创建新的唯一ID避免冲突 // 保持原有Panel ID不变避免Vue组件重新创建和状态丢失
const newPanels = sourceTabPage.panels.map((panel, panelIndex) => { const newPanels = sourceTabPage.panels.map((panel, panelIndex) => {
const newPanelId = `merged-panel-${Date.now()}-${tabIndex}-${panelIndex}` console.log(`[Area] 合并Panel到现有TabPage: ${panel.id}`)
console.log(`[Area] 合并Panel到现有TabPage: ${panel.id} -> ${newPanelId}`)
return { return {
...panel, ...panel,
id: newPanelId,
maximized: true maximized: true
} }
}) })
// 将新的Panel添加到现有TabPage // 将新的Panel添加到现有TabPage
existingTabPage.tabPage.panels.push(...newPanels) existingTabPage.tabPage.panels.push(...newPanels)
existingTabPage.panels.push(...newPanels) // existingTabPage.panels 是旧引用,保持结构一致性但避免重复添加
console.log(`[Area] 成功合并 ${newPanels.length} 个Panel到现有TabPage`) console.log(`[Area] 成功合并 ${newPanels.length} 个Panel到现有TabPage`)
} }

View File

@@ -58,8 +58,41 @@
<!-- Tab页内容区域 --> <!-- Tab页内容区域 -->
<div class="tab-content"> <div class="tab-content">
<!-- 渲染slot内容Panel组件 --> <!-- 渲染当前激活的Panel内容 -->
<slot></slot> <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> </div>
<!-- 右侧标签栏 --> <!-- 右侧标签栏 -->
@@ -122,6 +155,7 @@
<script setup> <script setup>
import { defineProps, defineEmits, ref, onMounted } from 'vue' import { defineProps, defineEmits, ref, onMounted } from 'vue'
import Panel from './Panel.vue'
const props = defineProps({ const props = defineProps({
id: { type: String, required: true }, id: { type: String, required: true },