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