# Module Spec:VabMenu module: id: vab-menu name: VabMenu(菜单体系) type: ui entrypoints: - library/components/VabMenu/index.vue - library/components/VabMenu/components/VabMenuItem.vue - library/components/VabMenu/components/VabSubMenu.vue public_api: concept: - "递归渲染菜单:VabMenu 根据子路由可见性选择渲染 VabSubMenu 或 VabMenuItem" - "点击菜单:根据 meta.target/_blank、外链/内链、同路由刷新等逻辑进行跳转或触发 reload" usage_examples: - "布局组件中引入 VabMenu,配合路由 meta 与权限渲染导航" dependency_closure: runtime: - "vue-router:useRoute/useRouter(跳转/判断当前路由)" - "store-settings:collapse/device/theme(layout) + foldSideBar(移动端点击收起)" - "plugin-vab:inject('$pub')(同路由点击触发 $pub('reload-router-view'))" - "config:isHashRouterMode(hash 模式下 _blank 打开内部路由)" - "utils/validate:isExternal(外链判断)" - "i18n:translate(菜单 title)" - "Element Plus:el-menu-item/el-sub-menu/el-tag" - "VabIcon" acceptance: - "item.children 中存在可见子路由时渲染 VabSubMenu,否则渲染 VabMenuItem" - "meta.target === '_blank' 时按外链/内链规则在新窗口打开" - "点击当前已激活路由时触发 $pub('reload-router-view')" pitfalls: - "组件内部使用 webpack require.context 自动注册子组件;迁移到非 webpack 构建器需等效替代" - "Element Plus 关于 teleported 的历史兼容问题:弹层渲染到 body 下时需要全局样式配合(见 VabMenu/index.vue 注释)" - "如果菜单权限依赖 ACL/指令(v-permissions/hasPermission),迁移时必须把相关依赖一起带走"