| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- <template>
- <div class="sidebar-container">
- <MenuItem
- v-for="item in menuData"
- :key="item.id"
- :node="item"
- @node-click="handleLeafNodeClick"
- />
- </div>
- </template>
- <script>
- // 引入刚刚写的递归组件
- import MenuItem from './MenuItem.vue';
- import { apiGetMenuTree } from '@/api';
- export default {
- name: 'SidebarMenu',
- components: {
- MenuItem
- },
- data() {
- return {
- menuData: []
- };
- },
- async mounted() {
- this.menuData = await apiGetMenuTree() || [];
- },
- methods: {
- // 捕获最底层路口的点击事件
- handleLeafNodeClick(nodeData) {
- console.log('用户点击了最底层路口:', nodeData);
- this.$emit('leaf-node-click', nodeData); // 将事件和数据传递给父组件
- // 在大屏项目中,通常下一步是:
- // 1. 触发全局状态管理 (Vuex/Pinia) 记录当前选中的路口 ID
- // 2. 命令地图组件平移/放大到该路口的经纬度 (nodeData.lng, nodeData.lat)
- // 3. 通知右侧图表组件重新拉取该路口的数据
- }
- }
- };
- </script>
- <style scoped>
- /* 整个侧边栏的深色背景 */
- .sidebar-container {
- width: 100%;
- height: 100%;
- background-color: #112445; /* 匹配截图中的深海蓝色 */
- overflow-y: auto;
- overflow-x: hidden;
- }
- /* 自定义滚动条样式,适配暗黑风 */
- .sidebar-container::-webkit-scrollbar {
- width: 6px;
- }
- .sidebar-container::-webkit-scrollbar-thumb {
- background: rgba(255, 255, 255, 0.2);
- border-radius: 3px;
- }
- .sidebar-container::-webkit-scrollbar-track {
- background: transparent;
- }
- </style>
|