perf: optimize devie tree, remove list rendering

This commit is contained in:
yangsy
2025-08-20 10:57:02 +08:00
parent c4e7baea95
commit b38c016b5e

View File

@@ -17,8 +17,8 @@ import {
NRadio,
NRadioGroup,
NScrollbar,
NTabPane,
NTabs,
NTab,
NTag,
NTree,
type TagProps,
@@ -217,8 +217,8 @@ const searchFilter = (pattern: string, node: TreeOption): boolean => {
};
// ========== 设备树交互 ==========
// 定位到选中的设备
const deviceTreeInsts = useTemplateRef<TreeInst[]>('deviceTreeInsts');
// 将多实例改为单实例,便于直接获取 Tree 实例
const deviceTreeInst = useTemplateRef<TreeInst>('deviceTreeInst');
const onClickLocateDeviceTree = () => {
selectedTab.value = (selectedDevice.value?.deviceType ?? selectedTab.value) as DeviceTypeCode;
selectedKeys.value = selectedDevice.value?.id ? [selectedDevice.value.id] : undefined;
@@ -238,7 +238,7 @@ const onClickLocateDeviceTree = () => {
};
const scrollDeviceTreeToSelectedDevice = (timeout: number = 500) => {
setTimeout(() => {
const inst = deviceTreeInsts.value?.at(0);
const inst = deviceTreeInst.value;
inst?.scrollTo({ key: selectedDevice.value?.id, behavior: 'smooth' });
}, timeout);
};
@@ -262,27 +262,31 @@ const scrollDeviceTreeToSelectedDevice = (timeout: number = 500) => {
</NFlex>
</div>
<div style="flex: 1; min-height: 0">
<NTabs v-model:value="selectedTab" animated type="line" placement="left" style="height: 100%">
<NTabPane v-for="pane in deviceTabPanes" :key="pane.name" :name="pane.name" :tab="pane.tab">
<NTree
v-model:selected-keys="selectedKeys"
v-model:expanded-keys="expandedKeys"
:ref="'deviceTreeInsts'"
:data="lineDeviceTreeData[pane.name]"
:show-irrelevant-nodes="false"
:pattern="searchPattern"
:filter="searchFilter"
:override-default-node-click-behavior="override"
default-expand-all
block-line
block-node
show-line
virtual-scroll
style="height: 100%"
/>
</NTabPane>
</NTabs>
<!-- 左侧为设备类型Tab右侧为设备树 -->
<div style="flex: 1; min-height: 0; display: flex; overflow: hidden">
<div style="flex: 0 0 auto; height: 100%">
<NTabs v-model:value="selectedTab" animated type="line" placement="left" style="height: 100%">
<NTab v-for="pane in deviceTabPanes" :key="pane.name" :name="pane.name" :tab="pane.tab" />
</NTabs>
</div>
<div style="flex: 1; min-width: 0">
<NTree
v-model:selected-keys="selectedKeys"
v-model:expanded-keys="expandedKeys"
:ref="'deviceTreeInst'"
:data="lineDeviceTreeData[selectedTab]"
:show-irrelevant-nodes="false"
:pattern="searchPattern"
:filter="searchFilter"
:override-default-node-click-behavior="override"
default-expand-all
block-line
block-node
show-line
virtual-scroll
style="height: 100%"
/>
</div>
</div>
</div>
</NLayoutSider>