前端如何根据ACL动态控制按钮显示?
我们后端返回的用户权限是类似 {"user:delete": true, "post:edit": false} 这样的ACL结构。现在我想在React组件里根据这个权限决定“删除用户”按钮要不要渲染,但不确定怎么设计才不会让组件到处都是判断逻辑。
我试过在每个按钮外面包一层检查函数,但感觉很重复。有没有更优雅的方式?比如用高阶组件或者自定义Hook?
const hasPermission = (action) => {
return userAcl[action] === true;
};
// 在组件里
{hasPermission('user:delete') && <button>删除用户</button>}
最推荐的是封装一个权限组件,把判断逻辑收敛到一个地方:
在应用入口挂载Provider:
组件里用起来就很干净了:
如果你嫌组件嵌套太深,也可以直接用Hook:
两种方式可以混着用,简单判断用Hook,复杂的或者需要fallback的场景用Authorized组件。
高阶组件的方式也可以,但现在Hooks更主流,HOC容易造成嵌套地狱,不太推荐了。
还有个坑要注意,权限数据一定要在组件渲染前准备好,不然会闪一下未授权的UI。可以在Provider外层加个loading状态,或者用Suspense处理。