发现点击tabpage的不同页标签,标签页内容没有改变
This commit is contained in:
@@ -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`)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
Reference in New Issue
Block a user