支持关闭标签页

This commit is contained in:
zqm
2026-01-07 13:33:52 +08:00
parent 56ef17e1cb
commit 1ae158bdd6
2 changed files with 95 additions and 3 deletions

View File

@@ -446,7 +446,83 @@ const onTabChange = async (data) => {
const onTabClose = async (data) => {
try {
await tabPageActions.requestClose(data.tabPageId, data.areaId);
// 适配数据结构从data.id获取Panel ID
const panelId = data.id;
if (!panelId) {
console.error('Tab close event missing panelId');
return;
}
console.log(`📋 处理标签页关闭事件:`, { data, panelId });
// 1. 查找包含该Panel的Area
let targetArea = null;
let targetTabPage = null;
let panelIndex = -1;
let areaId = null;
for (const area of floatingAreas.value) {
if (area.children && area.children.type === 'TabPage') {
const tabPage = area.children;
if (tabPage.children) {
const childrenArray = Array.isArray(tabPage.children) ? tabPage.children : [tabPage.children];
const index = childrenArray.findIndex(child => child.id === panelId);
if (index !== -1) {
targetArea = area;
targetTabPage = tabPage;
panelIndex = index;
areaId = area.id;
break;
}
}
}
}
if (!targetArea || !targetTabPage || !areaId) {
console.error(`❌ 找不到包含Panel ${panelId}的Area`);
return;
}
const tabPageId = targetTabPage.id || `tabPage-${areaId}`;
console.log(`✅ 找到目标Area和TabPage:`, { areaId, tabPageId, panelId });
// 2. 调用TabPageActions处理关闭请求
await tabPageActions.requestClose(tabPageId, areaId);
// 3. 移除Panel
if (Array.isArray(targetTabPage.children)) {
targetTabPage.children.splice(panelIndex, 1);
console.log(`📌 从TabPage移除Panel后剩余Panel数量: ${targetTabPage.children.length}`);
} else {
targetTabPage.children = null;
console.log(`📌 移除了唯一的Panel`);
}
// 4. 如果TabPage没有子元素了移除整个TabPage
if (!targetTabPage.children || (Array.isArray(targetTabPage.children) && targetTabPage.children.length === 0)) {
// 从Area的children中移除TabPage
targetArea.children = null;
console.log(`📌 TabPage已无Panel移除TabPage`);
}
// 5. 更新floatingAreas中的Area配置
const areaIndex = floatingAreas.value.findIndex(a => a.id === areaId);
if (areaIndex !== -1) {
floatingAreas.value[areaIndex] = { ...targetArea };
console.log(`📌 更新floatingAreas中的Area配置`);
// 6. 触发Area更新事件确保状态同步
areaActions.updateState(areaId, { children: targetArea.children });
console.log(`📌 触发Area更新事件`);
// 7. 调用PanelHandler的close方法回收Panel资源
panelActions.close(panelId, areaId);
console.log(`📌 调用PanelHandler回收Panel资源`);
console.log(`✅ 成功移除标签页和回收Panel: areaId=${areaId}, panelId=${panelId}`);
}
} catch (error) {
console.error('Failed to handle tab close:', error);
}