SidebarMenu.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <div class="sidebar-container">
  3. <MenuItem
  4. v-for="item in menuData"
  5. :key="item.id"
  6. :node="item"
  7. @node-click="handleLeafNodeClick"
  8. />
  9. </div>
  10. </template>
  11. <script>
  12. // 引入刚刚写的递归组件
  13. import MenuItem from './MenuItem.vue';
  14. export default {
  15. name: 'SidebarMenu',
  16. components: {
  17. MenuItem
  18. },
  19. data() {
  20. return {
  21. // 模拟后端返回的树形结构数据
  22. menuData: [
  23. {
  24. id: 'root-1',
  25. label: '主控中心',
  26. icon: 'el-icon-monitor', // 这里可以替换为你项目用的图标类名,比如 iconfont
  27. children: [
  28. {
  29. id: 'team-1',
  30. label: '北京市交警总队',
  31. children: [
  32. {
  33. id: 'dist-1',
  34. label: '昌平区',
  35. children: [
  36. {
  37. id: 'street-1',
  38. label: '龙泽园街道',
  39. children: [
  40. { id: 'node-101', label: '文华路口', lng: 116.3, lat: 40.1 },
  41. { id: 'node-102', label: '同城街路口', lng: 116.4, lat: 40.2 }
  42. ]
  43. }
  44. ]
  45. },
  46. {
  47. id: 'dist-2',
  48. label: '丰台区',
  49. children: [
  50. {
  51. id: 'street-2',
  52. label: '龙泽园街道', // 图里似乎数据有重复,这里照猫画虎
  53. children: [
  54. { id: 'node-201', label: '文华路口' },
  55. { id: 'node-202', label: '同城街路口' }
  56. ]
  57. }
  58. ]
  59. }
  60. ]
  61. }
  62. ]
  63. }
  64. ]
  65. };
  66. },
  67. methods: {
  68. // 捕获最底层路口的点击事件
  69. handleLeafNodeClick(nodeData) {
  70. console.log('用户点击了最底层路口:', nodeData);
  71. this.$emit('leaf-node-click', nodeData); // 将事件和数据传递给父组件
  72. // 在大屏项目中,通常下一步是:
  73. // 1. 触发全局状态管理 (Vuex/Pinia) 记录当前选中的路口 ID
  74. // 2. 命令地图组件平移/放大到该路口的经纬度 (nodeData.lng, nodeData.lat)
  75. // 3. 通知右侧图表组件重新拉取该路口的数据
  76. }
  77. }
  78. };
  79. </script>
  80. <style scoped>
  81. /* 整个侧边栏的深色背景 */
  82. .sidebar-container {
  83. width: 100%;
  84. height: 100%;
  85. background-color: #112445; /* 匹配截图中的深海蓝色 */
  86. overflow-y: auto;
  87. overflow-x: hidden;
  88. }
  89. /* 自定义滚动条样式,适配暗黑风 */
  90. .sidebar-container::-webkit-scrollbar {
  91. width: 6px;
  92. }
  93. .sidebar-container::-webkit-scrollbar-thumb {
  94. background: rgba(255, 255, 255, 0.2);
  95. border-radius: 3px;
  96. }
  97. .sidebar-container::-webkit-scrollbar-track {
  98. background: transparent;
  99. }
  100. </style>