From 82789c78a914d6cf18fe249a7c7ca3629808baa8 Mon Sep 17 00:00:00 2001 From: yangsy Date: Wed, 21 Jan 2026 15:23:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BD=A6=E7=AB=99=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E5=88=97=E6=95=B0=E8=87=AA=E9=80=82=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/station/station-page.vue | 49 ++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/pages/station/station-page.vue b/src/pages/station/station-page.vue index 558b250..d2c7983 100644 --- a/src/pages/station/station-page.vue +++ b/src/pages/station/station-page.vue @@ -4,11 +4,11 @@ import { AlarmDetailModal, DeviceDetailModal, DeviceParamConfigModal, IcmpExport import { useBatchActions, useLineDevicesQuery } from '@/composables'; import { useAlarmStore, useDeviceStore, useSettingStore, useStationStore } from '@/stores'; import { useMutation } from '@tanstack/vue-query'; -import { objectEntries } from '@vueuse/core'; +import { objectEntries, useElementSize } from '@vueuse/core'; import { isCancel } from 'axios'; import { NButton, NButtonGroup, NCheckbox, NFlex, NGrid, NGridItem, NScrollbar } from 'naive-ui'; import { storeToRefs } from 'pinia'; -import { computed, ref } from 'vue'; +import { computed, ref, useTemplateRef } from 'vue'; const settingStore = useSettingStore(); const { stationGridCols } = storeToRefs(settingStore); @@ -22,6 +22,21 @@ const { lineDevices } = storeToRefs(deviceStore); const alarmStore = useAlarmStore(); const { lineAlarms } = storeToRefs(alarmStore); +const STATION_CARD_MIN_WIDTH = 230; +const STATION_GRID_PADDING = 8; +const STATION_GRID_GAP = 6; +const STATION_GRID_REF_NAME = 'stationGridRef'; +const stationGridRef = useTemplateRef(STATION_GRID_REF_NAME); +const { width: stationGridWidth } = useElementSize(stationGridRef); +// 计算合适的车站布局列数 +const actualStationGridColumns = computed(() => { + const currentStationCardWidth = (stationGridWidth.value - STATION_GRID_PADDING * 2 - (stationGridCols.value - 1) * STATION_GRID_GAP) / stationGridCols.value; + // 当卡片宽度大于最小宽度时,说明用户的设置没有问题,直接返回列数 + if (currentStationCardWidth > STATION_CARD_MIN_WIDTH) return stationGridCols.value; + // 否则,说明用户的设置不合适,需要根据当前布局宽度重新计算列数 + return Math.floor((stationGridWidth.value - STATION_GRID_PADDING * 2 + STATION_GRID_GAP) / STATION_CARD_MIN_WIDTH); +}); + const showIcmpExportModal = ref(false); const showRecordCheckExportModal = ref(false); @@ -155,7 +170,7 @@ const onClickDetail: StationCardProps['onClickDetail'] = (type, station) => {