Vue中如何根据角色动态渲染侧边栏菜单?
最近在做后台管理系统时遇到权限控制问题。我尝试根据用户角色动态显示侧边栏菜单,但发现角色切换后旧菜单残留:
export default {
data() {
return {
menus: [],
userRole: 'guest' // 应该从接口获取
}
},
created() {
this.fetchMenus();
setTimeout(() => this.userRole = 'admin', 1000); // 模拟异步角色获取
},
methods: {
checkRole(roles) {
return roles.includes(this.userRole);
}
}
}
当userRole从guest变为admin后,新菜单没显示出来,控制台也没有报错。我该在哪个生命周期处理角色变更?或者应该用计算属性重新计算菜单列表?
用计算属性是最直接的方案:
export default {
data() {
return {
allMenus: [], // 存全部菜单
userRole: 'guest'
}
},
computed: {
menus() {
// 根据当前角色过滤菜单
return this.allMenus.filter(menu => {
if (!menu.roles) return true; // 不需要权限的菜单
return menu.roles.includes(this.userRole);
});
}
},
created() { this.fetchMenus();
this.fetchUserRole(); // 这里要改成从接口获取真实角色
},
methods: {
async fetchMenus() {
const res = await fetch('/api/menus');
this.allMenus = await res.json();
},
async fetchUserRole() {
const res = await fetch('/api/user/role');
const data = await res.json();
this.userRole = data.role;
}
}
}
菜单数据大概是这样的结构:
[
{ name: 'Dashboard', path: '/dashboard', roles: ['admin', 'editor'] },
{ name: '用户管理', path: '/users', roles: ['admin'] },
{ name: '系统设置', path: '/settings', roles: ['admin'] },
{ name: '公告', path: '/notice', roles: null } // 所有人可见
]
安全方面提醒几点:前端角色过滤只是给用户看的,真正的权限控制要在后端API做。每个接口调用都要校验用户权限,前端隐藏的菜单不代表接口调用不了。还有userRole从接口返回后最好存vuex或pinia里,统一管理,localStorage里也要存一份防止页面刷新丢失。
menus没有重新计算导致的。通用的做法是用计算属性来处理菜单列表。这样当
userRole变化时,计算属性会自动重新计算,Vue 会帮你更新视图。你可以这样改:这里我把原始菜单放到
allMenus里,然后用计算属性menus来过滤出当前角色能访问的菜单。每次userRole变化时,menus会自动更新。另外,如果角色是从接口动态获取的,记得在数据回来后再更新
userRole,确保视图同步刷新。最后提醒一下,这种简单的角色匹配适合小型项目,如果是复杂的权限系统,建议用 Vuex 或 Pinia 统一管理权限状态,不然代码会越来越乱。