流程控制在动态菜单加载中嵌入数据筛选、路由注入、UI条件展示三环节,起过滤调度作用:权限数据到位→判断展示条件→执行显示/隐藏/跳过/报错分支。

流程控制在动态菜单加载中不是用来“写if-else渲染整个菜单”的,而是嵌入在数据筛选、路由注入、UI条件展示三个关键环节里,起决定性过滤和调度作用。核心逻辑是:权限数据到位 → 判断是否满足展示条件 → 执行对应分支(显示/隐藏/跳过/报错)。
用 computed 或 filter 做菜单项级权限过滤
前端拿到原始菜单数组后,不能直接遍历渲染,必须先按用户角色或权限字段做一次筛选。推荐用 computed(Vue)或 filter + map(原生 JS)实现声明式过滤:
- 每个菜单项带 auth 字段,如
auth: ['admin', 'super']或roles: ['USER_MANAGE'] - 当前用户角色存在该字段中,才保留该项;否则过滤掉
- 二级菜单需递归判断:父项可见 ≠ 子项自动可见,子项也要单独校验权限
- 避免在模板里写
v-if="user.role === 'admin'"—— 这会导致逻辑分散、难以维护
路由守卫中用 if 分支控制导航流向
用户点击一个未加载的权限路由(如 /order/log),此时路由尚未注册。全局前置守卫要主动拦截并分情况处理:
- 已登录但无该路由 → 触发菜单拉取 + 动态注入 →
next({ path: to.path })重试 - 已登录且有缓存菜单但没对应路由 → 从 localStorage 读取、注入 → 放行
- 已登录但权限不足 → 跳转 403 或重定向到首页
- 未登录 → 强制跳转 /login
用 conditionalPanel 或动态组件控制 UI 区域显隐
某些功能模块(如“导出按钮”“高级搜索区”)不需要整页路由级控制,只需在当前页面内按权限开关。这时用轻量级条件判断更合适:
立即学习“Java免费学习笔记(深入)”;
- Vue 中用
v-if="hasPermission('EXPORT_ORDER')"控制按钮显示 - R Shiny 中用
conditionalPanel(condition = "input.role === 'admin'") - React 中用
{user.permissions.includes('EDIT_PROFILE') && <editform></editform>} - 关键点:条件表达式必须基于已知权限状态,不能依赖尚未获取的异步结果
字段级权限需额外一层元数据驱动判断
当菜单下某个表单字段也受权限约束(例如“财务金额”仅对 finance 角色可见),流程控制要延伸到字段渲染层:
- 后端提供
/api/form/schema?resource=user接口,返回带visible: true/false和readonly: true/false的字段配置 - 前端根据该配置循环生成表单项,用
if (field.visible)决定是否插入 DOM - 新增行时,同样依据该元数据初始化字段,而非硬编码结构
- 避免把权限判断写死在组件模板里,应抽离为可复用的
canShow(field)工具函数


















