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,14 +262,19 @@ const scrollDeviceTreeToSelectedDevice = (timeout: number = 500) => {
</NFlex> </NFlex>
</div> </div>
<div style="flex: 1; min-height: 0"> <!-- 左侧为设备类型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%"> <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"> <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 <NTree
v-model:selected-keys="selectedKeys" v-model:selected-keys="selectedKeys"
v-model:expanded-keys="expandedKeys" v-model:expanded-keys="expandedKeys"
:ref="'deviceTreeInsts'" :ref="'deviceTreeInst'"
:data="lineDeviceTreeData[pane.name]" :data="lineDeviceTreeData[selectedTab]"
:show-irrelevant-nodes="false" :show-irrelevant-nodes="false"
:pattern="searchPattern" :pattern="searchPattern"
:filter="searchFilter" :filter="searchFilter"
@@ -281,8 +286,7 @@ const scrollDeviceTreeToSelectedDevice = (timeout: number = 500) => {
virtual-scroll virtual-scroll
style="height: 100%" style="height: 100%"
/> />
</NTabPane> </div>
</NTabs>
</div> </div>
</div> </div>
</NLayoutSider> </NLayoutSider>