SidebarMenu.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. import { apiGetMenuTree } from '@/api';
  15. export default {
  16. name: 'SidebarMenu',
  17. components: {
  18. MenuItem
  19. },
  20. data() {
  21. return {
  22. menuData: []
  23. };
  24. },
  25. async mounted() {
  26. this.menuData = await apiGetMenuTree() || [];
  27. },
  28. methods: {
  29. // 捕获最底层路口的点击事件
  30. handleLeafNodeClick(nodeData) {
  31. console.log('用户点击了最底层路口:', nodeData);
  32. this.$emit('leaf-node-click', nodeData); // 将事件和数据传递给父组件
  33. // 在大屏项目中,通常下一步是:
  34. // 1. 触发全局状态管理 (Vuex/Pinia) 记录当前选中的路口 ID
  35. // 2. 命令地图组件平移/放大到该路口的经纬度 (nodeData.lng, nodeData.lat)
  36. // 3. 通知右侧图表组件重新拉取该路口的数据
  37. }
  38. }
  39. };
  40. </script>
  41. <style scoped>
  42. /* 整个侧边栏的深色背景 */
  43. .sidebar-container {
  44. width: 100%;
  45. height: 100%;
  46. background-color: #112445; /* 匹配截图中的深海蓝色 */
  47. overflow-y: auto;
  48. overflow-x: hidden;
  49. }
  50. /* 自定义滚动条样式,适配暗黑风 */
  51. .sidebar-container::-webkit-scrollbar {
  52. width: 6px;
  53. }
  54. .sidebar-container::-webkit-scrollbar-thumb {
  55. background: rgba(255, 255, 255, 0.2);
  56. border-radius: 3px;
  57. }
  58. .sidebar-container::-webkit-scrollbar-track {
  59. background: transparent;
  60. }
  61. </style>