Skip to content

SplitLayout

文件编辑器中心分割布局组件。

Props

属性描述类型默认值
saveBeforeUnload是否应该在 window.beforeunload 时触发 canSaveLayout 事件booleantrue
showTabHeader是否显示TAB分组组件,当为 true 时,支持一个网格多个子面板,应该在tabContentRender插槽中渲染组件;当为 false 时,仅支持网格分割不支持面板与拖拽功能,应该在gridRender中自己渲染内容。booleantrue
rootGridType指定根网格的类型,通常用于在多个组件中设置不同的类型以限制互相拖拽CodeLayoutGrid'centerArea'

Events

事件名描述参数
panelClose面板关闭时触发此事件,可以异步调用 resolve,或者 reject 阻止关闭panel: CodeLayoutSplitNPanelInternal, resolve: () => void, reject: (e?: any) => void)
panelContextMenu用户在面板上点击右键菜单时触发此事件panel: CodeLayoutSplitNPanelInternal, event: MouseEvent
panelActive当用户点击激活面板时触发事件lastActivePanel: CodeLayoutSplitNPanelInternal, panel: CodeLayoutSplitNPanelInternal
panelDrop当用户拖拽面板放置时触发事件panel: CodeLayoutSplitNPanelInternal, referencePanel: CodeLayoutSplitNPanelInternal, referencePosition: CodeLayoutDragDropReferencePosition
gridActive当用户点击激活网格时触发事件lastActivePanel: CodeLayoutSplitNGridInternal, panel: CodeLayoutSplitNGridInternal
canLoadLayout组件加载时触发此事件,可在此事件中执行加载布局操作ref: CodeLayoutSplitNInstance
canSaveLayout组件卸载时触发此事件,可在此事件中执行加载保存操作ref: CodeLayoutSplitNInstance

Slots

插槽名描述参数
tabContentRender面板内容渲染插槽{ panel: CodeLayoutSplitNPanelInternal }
tabEmptyContentRender当不收缩网格没有子面板时的渲染插槽{ grid: CodeLayoutSplitNGridInternal }
tabHeaderExtraRenderTAB头部额外区域渲染插槽{ grid: CodeLayoutSplitNGridInternal }
tabItemRenderTAB标签的自定义渲染{ index: number, panel: CodeLayoutSplitNPanelInternal, active: boolean }
tabRender自定义TAB渲染,通常你不需要自定义{ grid: CodeLayoutSplitNGridInternal }
gridRendershowTabHeaderfalse 时,仅支持网格分割不支持面板与拖拽功能,在此插槽中自己渲染内容{ grid: CodeLayoutSplitNGridInternal }

CodeLayoutSplitNInstance

getRootGrid(): CodeLayoutSplitNGridInternal

说明:

获取根网格。

返回值:

类型说明
CodeLayoutSplitNGridInternal返回的组实例

getPanelByName(name: string): CodeLayoutSplitNPanelInternal | undefined

说明:

通过名称获取指定的面板。

参数:

名称说明
name面板名称

返回值:

类型说明
CodeLayoutSplitNPanelInternal or undefined找到的面板实例,如果在组件中未找到此面板,则返回undefined

getGridByName(name: string): CodeLayoutSplitNGridInternal | undefined

说明:

通过名称获取指定的网格。

参数:

名称说明
name网格名称

返回值:

类型说明
CodeLayoutSplitNGridInternal or undefined找到的网格实例,如果在组件中未找到此网格,则返回undefined

getActiveGird(): CodeLayoutSplitNGridInternal|undefined

说明:

获取用户当前激活的可用于添加面板的网格。

activePanel(name: string): void

说明:

通过名称激活指定的面板,如果指定名称面板在组件中不存在,则没有效果。

此函数会同时修改激活的网格。

参数:

名称说明
name网格名称

clearLayout(): void

说明:

清空当前组件中的所有面板与网格数据。

loadLayout(json: any, instantiatePanelCallback: (data: CodeLayoutSplitNPanel) => CodeLayoutSplitNPanel): void

说明:

加载布局数据,根据面板名称实例化面板。

注,由于保存布局数据仅保存每个布局的基础位置、大小等信息,并不包含无法序列化的信息(例如回调函数,图标),所以加载布局数据时需要在 instantiatePanelCallback 中,根据传入的面板名称填充这些数据。

ts
const data = localStorage.getItem('LayoutData');
if (data) {
  //If load layout from data, need fill panel data
  splitLayout.value.loadLayout(JSON.parse(data), (panel) => {
    switch (panel.name) {
      case 'file1':
        panel.title = 'File 1';
        panel.tooltip = 'File path c://...';
        panel.badge = '2';
        panel.iconSmall = () => h(IconFile);
        break;
    }
    return panel;
  });
} else {
  //No data, create new layout
  //...
}

参数:

名称说明
jsonsaveLayout 返回的布局数据
instantiatePanelCallback实例化面板回调,传入参数为面板基础信息

saveLayout(): any

说明:

保存用户拖拽后的布局至JSON数据中,在下一次进入后可调用 loadLayout 重新从JSON数据加载恢复原布局。

返回值:

类型说明
object布局数据

CodeLayoutSplitNPanelInternal

Panel type definition of SplitLayout.

属性描述类型默认值
name面板名称,用于查找面板string-
title面板标题string-
tooltip面板的工具提示string-
badge面板的标记string-
iconSmall面板图标() => VNode-
size当前面板的大小(百分比),创建时指定为0将由组件自动分配大小number0
parentGroup获取当前面板的父级组CodeLayoutSplitNPanelInternal-
parentGrid获取当前面板所属的顶级组CodeLayoutGrid-
accept设置当前面板可以拖放到哪些顶级网格上CodeLayoutGrid[]-
actions当前面板的自定义操作CodeLayoutActionButton[]false
data面板的自定义数据any-

closePanel(): void

说明:

手动触发当前面板的关闭操作。

splitCopy(direction: CodeLayoutSplitCopyDirection, instanceCb: (panel: CodeLayoutSplitNPanel) => CodeLayoutSplitNPanel): void

说明:

克隆当前面板并且向指定方向分割。通常用于文件编辑器需要分成两个窗口编辑时使用。

参数:

名称描述
direction分割方向
instanceCb实例化新面板回调

例如,以下参考代码绑定在面板的右键菜单事件中,用户右键点击菜单项可以将选中的面板向四个方向克隆并分割。

ts
function onPanelMenu(panel: CodeLayoutPanelInternal, e: MouseEvent) {
  e.stopPropagation();
  e.preventDefault();
  
  ContextMenuGlobal.showContextMenu({
    x: e.x,
    y: e.y,
    items: [
      {
        label: "Split Up",
        onClick: () => {
          (panel as CodeLayoutSplitNPanelInternal).splitCopy('top', (panel) => {
            panel.name = panel.name + '.copy';
            panel.title = panel.title + ' Clone';
            return panel;
          });
        }
      },
      {
        label: "Split Down",
        onClick: () => {
          (panel as CodeLayoutSplitNPanelInternal).splitCopy('bottom', (panel) => {
            panel.name = panel.name + '.copy';
            panel.title = panel.title + ' Clone';
            return panel;
          });
        }
      },
      {
        label: "Split Left",
        onClick: () => {
          (panel as CodeLayoutSplitNPanelInternal).splitCopy('left', (panel) => {
            panel.name = panel.name + '.copy';
            panel.title = panel.title + ' Clone';
            return panel;
          });
        }
      },
      {
        label: "Split Right",
        onClick: () => {
          (panel as CodeLayoutSplitNPanelInternal).splitCopy('right', (panel) => {
            panel.name = panel.name + '.copy';
            panel.title = panel.title + ' Clone';
            return panel;
          });
        }
      },
    ],
  });
}

CodeLayoutSplitNGridInternal

Grid type definition of SplitLayout.

属性描述类型默认值
canMinCloseSet whether users can close the current panel by continuously shrinking it.booleanfalse
directionLayout direction.'vertical' or 'horizontal''vertical'
childGridChild grid of this grid.CodeLayoutSplitNGridInternal[]-

addGrid(grid: CodeLayoutSplitNGrid): CodeLayoutSplitNPanelInternal

说明:

向当前网格添加子网格。

参数:

名称说明
grid网格数据

返回值:

子网格实例。

removePanel(grid: CodeLayoutSplitNGrid)

说明:

向当前网格移除子网格。

参数:

名称说明
grid网格数据

addPanel(panel: CodeLayoutSplitNPanel, startOpen = false): CodeLayoutSplitNPanelInternal

说明:

向当前组添加子面板。

参数:

名称说明
panel面板数据
startOpen添加时是否是打开状态

返回值:

子面板实例。

removePanel(panel: CodeLayoutSplitNPanelInternal, shrink = false): CodeLayoutSplitNPanelInternal

说明:

向当前组移除子面板。

参数:

名称说明
panel面板实例
shrink是否执行收缩操作

setActiveChild(child: CodeLayoutSplitNPanelInternal|null): void

说明:

设置激活的面板。

参数:

名称说明
child要激活的面板

reselectActiveChild(): void

说明:

重新选中一个可用的面板作为激活的面板。

Released under the MIT License.