From a0967df707a547428df9fc80256877c26e061c4a Mon Sep 17 00:00:00 2001 From: guonan <guonan201020@163.com> Date: 星期二, 20 五月 2025 15:41:54 +0800 Subject: [PATCH] 还原目录树功能 --- src/components/menu/Location.vue | 141 +++++++++++++++++----------------------------- 1 files changed, 52 insertions(+), 89 deletions(-) diff --git a/src/components/menu/Location.vue b/src/components/menu/Location.vue index 312a474..23a3bd3 100644 --- a/src/components/menu/Location.vue +++ b/src/components/menu/Location.vue @@ -1,53 +1,57 @@ - <template> - <div class="district"> - <div class="left-top"> - <span>鐩戞祴浣嶇疆</span> +<template> + <div class="district"> + <div class="left-top"> + <span>鐩戞祴浣嶇疆</span> + </div> + + <div class="left-content district-content"> + <div style="margin-left: 5px"> + <span style="color: white">閲嶇偣娌燂細</span> + <el-select + @change="handleChange" + v-model="selectValue" + placeholder="Select" + size="large" + style="width: 240px" + > + <el-option + v-for="item in options" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> </div> - <div class="left-content district-content"> - <div style="margin-left: 5px"> - <span style="color: white">閲嶇偣娌燂細</span> - <el-select @change="handleChange" v-model="selectValue" placeholder="Select" size="large" - style="width: 240px"> - <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> + <!-- 婊氬姩鍖哄煙 --> + <div style="overflow-y: auto; height: 95%"> + <!-- 鍔犺浇閬僵灞� --> + <div v-if="loading" class="loading-overlay"> + <div class="spinner"></div> </div> - - <!-- 婊氬姩鍖哄煙 --> - <div style="overflow-y: auto; height: 95%"> - <!-- 鍔犺浇閬僵灞� --> - <div v-if="loading" class="loading-overlay"> - <div class="spinner"></div> - </div> - <div v-else v-for="(item, key) in districtList" :key="key" class="district-item" @click="handleClick(item)"> - <div class="district-item-icon"></div> - <div class="district-item-text">{{ item.hdName }}</div> - </div> + <div + v-else + v-for="(item, key) in districtList" + :key="key" + class="district-item" + @click="handleClick(item)" + > + <div class="district-item-icon"></div> + <div class="district-item-text">{{ item.hdName }}</div> </div> </div> </div> - </template> + </div> +</template> <script setup> -import { ref, onMounted, watch, onBeforeUnmount } from "vue"; -import { createPoint, removeEntities } from "@/utils/map"; +import { ref, onMounted, watch } from "vue"; +import { createPoint } from "@/utils/map"; import { useSimStore } from "@/store/simulation"; import { initeWaterPrimitiveView } from "@/utils/water"; //鐩告満flyTo鍑芥暟锛屽悗缁璷ptions鍒楄〃涓湁瀵瑰簲缁忕含搴﹀悗寮冪敤 -import { useRoute, onBeforeRouteUpdate } from 'vue-router'; -const simStore = useSimStore(); -onBeforeRouteUpdate((to, from, next) => { - if (to.path !== '/yhgl') { - handleCleanup(); - } - next(); -}); -const route = useRoute(); -onBeforeUnmount(() => { - if (route.path !== '/yhgl') { - handleCleanup(); - } -}); +const simStore = useSimStore(); + const selectValue = ref("瀛欒儭娌�"); const options = ref([ @@ -88,39 +92,17 @@ }); } } -const handleCleanup = async () => { - await Promise.all(districtList.value.map(item => removeEntities(item.hdId))); -} -const initializeDevicePoints = async () => { - await Promise.all(districtList.value.map(async (item, index) => { - // 鏍规嵁闇�姹傚彲澧炲垹 - item.id = item.hdId; - item.name = item.hdName; - item.latitude = item.lat; - item.longitude = item.lon; - item.showBillboard = true; - item.type = item.disasterType; - item.className = "district"; - await createPoint(item); - // 鎵撳嵃姣忎釜璁惧鐨勫悕绉板拰璁惧绫诲瀷 - // console.log(`璁惧鍚嶇О: ${item.id}, 璁惧绫诲瀷: ${item.name}`); - })); -}; + // 鏍规嵁鍖哄煙鍚嶇О杩囨护鏁版嵁 -const filterDataByArea = async (areaName) => { - handleCleanup(); +const filterDataByArea = (areaName) => { if (!areaName || !simStore.DangerPoint || simStore.DangerPoint.length === 0) { districtList.value = []; return; } - const filteredData = simStore.DangerPoint.filter((item) => + + districtList.value = simStore.DangerPoint.filter((item) => item.position?.includes(areaName) ); - - if (JSON.stringify(districtList.value) !== JSON.stringify(filteredData)) { - districtList.value = filteredData; - await initializeDevicePoints(); - } }; // 澶勭悊鍖哄煙鍙樺寲浜嬩欢 @@ -130,23 +112,10 @@ ElMessage.warning("璇烽�夋嫨涓�涓尯鍩�"); return; } + filterDataByArea(areaName); }; -let isInitialized = false; -watch(() => simStore.DangerShowSwitch, async (newValue, oldValue) => { - console.log('褰撳墠鐘舵�侊細', newValue); - - if (newValue) { - if (!isInitialized) { - await initializeDevicePoints(); - isInitialized = true; - } - } else { - handleCleanup(); - isInitialized = false; - } -}); // 鐩戝惉 simStore.DangerPoint 鍙樺寲 watch( () => simStore.DangerPoint, @@ -155,16 +124,15 @@ filterDataByArea(selectValue.value); loading.value = false; // 鏁版嵁鍔犺浇瀹屾垚 } else { - handleCleanup(); districtList.value = []; loading.value = true; // 鏁版嵁鏈噯澶囧氨缁� } - } + }, + { immediate: true } ); onMounted(() => { - handleCleanup() - initeWaterPrimitiveView() + initeWaterPrimitiveView(); // 榛樿鍏堟鏌ヤ竴閬嶆暟鎹� if (simStore.DangerPoint && simStore.DangerPoint.length > 0) { filterDataByArea("瀛欒儭娌�"); @@ -182,8 +150,7 @@ left: 0px; right: 0px; bottom: 10px; - background-color: rgba(236, 233, 233, 0.5); - /* 鍗婇�忔槑閬僵 */ + background-color: rgba(43, 43, 43, 0.5); display: flex; align-items: center; justify-content: center; @@ -204,7 +171,6 @@ transform: rotate(360deg); } } - .district { position: absolute; width: 345px; @@ -219,12 +185,10 @@ cursor: pointer; margin-top: 10px; } - .district-content { padding: 10px; box-sizing: border-box; } - .district-item-icon { background: url("@/assets/img/menu/locationicon.png") no-repeat; background-position: 5px 5px; @@ -251,7 +215,6 @@ /deep/ .el-select__placeholder { color: white; } - /deep/ .el-select-dropdown__item.hover, .el-select-dropdown__item:hover { color: white !important; -- Gitblit v1.9.3