he wei
2025-04-23 b9bd29a1a81f6f7de479e3cc3fdfe3d85fc660bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<script setup>
  import { ref, onMounted, reactive, nextTick, watch } from "vue";
  import { getSiteList } from "@/api/common";
  import { formatAreaTree } from "@/utils/tree";
import { format } from "echarts";
  import { useRoute, useRouter } from "vue-router";
  const route = useRoute();
  const router = useRouter();
 
  const emit = defineEmits(["itemClick"]);
  const defaultProps = reactive({
    children: "children",
    label: "label",
  });
 
  const treeRef = ref();
  const data = ref([]);
  const defaultSelect = ref([1]);
 
  const currentId = ref();
 
  onMounted(() => {
    getTree();
  });
 
  watch(
    () => currentId.value,
    () => {
      treeRef.value.setCurrentKey(currentId.value);
    }
  );
 
  function setCurrent(val) {
    currentId.value = val;
    treeRef.value.setCurrentKey(currentId.value);
 
  }
 
  function handleNodeClick(data, node, event) {
    console.log(data);
    if (data.children) {
      treeRef.value.setCurrentKey(currentId.value);
      return;
    } else {
      
      // 设置当前点击的叶子节点为选中状态
      currentId.value = node.data.id;
      console.log('点击了叶子节点:', data.label, node.data.id);
    }
    emit("itemClick", data);
  }
 
  // 查找第一个叶子节点的函数
  function findFirstLeafNode(data) {
    for (let i = 0; i < data.length; i++) {
      const node = data[i];
      if (!node.children || node.children.length === 0) {
        return node.id || node.stationId;
      }
      const leafId = findFirstLeafNode(node.children);
      if (leafId) {
        return leafId;
      }
    }
    return null;
  }
 
  async function getTree() {
    try {
      const res = await getSiteList();
      let _data = [];
      if (res.code === 1 && res.data) {
        _data = res.data2;
      }
      console.log('_data', _data, '=============');
      
      const treeList = formatAreaTree(_data);
      console.log(treeList, "treeList");
      data.value = treeList;
      await nextTick();
      const firstLeafId = currentId.value || findFirstLeafNode(treeList);
      
      if (firstLeafId) {
        const node = treeRef.value.getNode(firstLeafId);
        expandParentNodes(firstLeafId);
        treeRef.value.setCurrentKey(firstLeafId);
        // treeRef.value.setCurrentNode(node);
 
        handleNodeClick(node.data, node, treeRef.value);
        
        // handleNodeClick(node.data);
      }
    } catch (e) {
      console.log(e);
    }
  }
 
 
  const expandParentNodes = (nodeId) => {
    if (treeRef.value) {
      const node = treeRef.value.getNode(nodeId);
      node.expanded = true;
      // const expandedKeys = [];
      function expandParents(currentNode) {
        if (currentNode.parent) {
          // expandedKeys.push(currentNode.parent.data.id);
          currentNode.parent.expanded = true;
          expandParents(currentNode.parent);
        }
      }
      expandParents(node);
      // const currentExpandedKeys = treeRef.value.getExpandedKeys();
      // const newExpandedKeys = [...new Set([...currentExpandedKeys, ...expandedKeys])];
      // treeRef.value.setExpandedKeys(newExpandedKeys);
    }
  }
 
  defineExpose({ setCurrent });
 
</script>
 
<template>
  <el-scrollbar>
    <el-tree
      style="max-width: 600px"
      ref="treeRef"
      :data="data"
      :props="defaultProps"
      node-key="id"
      :expand-on-click-node="false"
      :default-checked-keys="defaultSelect"
      @node-click="handleNodeClick"
    />
  </el-scrollbar>
</template>
 
<style scoped lang="less"></style>