【前端权限】自定义权限 Hook / Composition API建立按钮级 /字段级 /菜单权限控制

news/2026/1/20 22:42:42/文章来源:https://www.cnblogs.com/gccbuaa/p/19508986

自定义权限 Hook / Composition API实现按钮级 /字段级 /菜单权限控制

引言

在现代前端开发中,HookComposition API为开发者提供了更灵活、更模块化的方式来处理复杂逻辑。老曹在实际项目中发现,通过封装自定义权限Hook(如usePermissionuseAccess),可以显著提升代码的复用性和可维护性。本节课将围绕Vue 3的Composition API和React的Custom Hook展开,深入探讨如何封装权限判断函数,实现高效、优雅的权限控制。

老曹提示
自定义权限Hook不仅能简化权限判断逻辑,还能让组件代码更加清晰。例如,在一个复杂的表单页面中,通过usePermission可以轻松控制每个字段的可见性,而无需在模板中嵌套大量条件判断。


学习目标

  1. 理解自定义权限Hook的核心概念及其应用场景。
  2. 掌握使用Vue 3的Composition API封装权限逻辑。
  3. 学会通过React的Custom Hook实现权限判断。
  4. 熟悉权限Hook的设计思路与优化策略。
  5. 能够独立完成权限Hook的开发与调试。

一、自定义权限 Hook 的概述

1.1 自定义权限 Hook 的定义与优势

自定义权限Hook是一种封装权限逻辑的工具,其核心目标是:

  • 逻辑复用:将权限判断逻辑集中到一个函数中,避免重复代码。
  • 代码简洁:减少组件中的冗余逻辑,使代码更易读。
  • 灵活性高:支持动态更新权限状态,适应复杂场景需求。

1.2 应用场景分析

自定义权限Hook广泛应用于以下场景:


️ 二、Vue 3 中的自定义权限 Hook

2.1 使用 Composition API 封装 usePermission

2.1.1 设计思路

usePermission的核心功能是判断当前用户是否具备指定权限。以下是设计步骤:

  1. 获取权限状态:从全局状态管理工具(如Pinia)中读取用户权限列表。
  2. 封装权限判断逻辑:提供一个函数,接收权限标识并返回布尔值。
  3. 支持动态更新:监听权限状态的变化,确保实时同步。
2.1.2 示例代码解析
// hooks/usePermission.js
import { computed } from 'vue';
import { usePermissionStore } from '@/stores/permission';
export function usePermission() {
const permissionStore = usePermissionStore();
// 封装权限判断函数
const hasPermission = (permission) => {
return permissionStore.permissions.includes(permission);
};
// 支持多权限判断
const hasAnyPermission = (permissions) => {
return permissions.some((perm) => permissionStore.permissions.includes(perm));
};
return { hasPermission, hasAnyPermission };
}
2.1.3 在组件中使用
<template><div><button v-if="hasPermission('edit')">编辑</button><button v-if="hasAnyPermission(['delete', 'admin'])">删除</button></div></template><script>import { usePermission } from '@/hooks/usePermission';export default {setup() {const { hasPermission, hasAnyPermission } = usePermission();return { hasPermission, hasAnyPermission };},};</script>

2.2 封装 useAccess 实现更高级的权限控制

useAccess可以进一步扩展,支持基于角色或其他条件的权限判断。

2.2.1 示例代码解析
// hooks/useAccess.js
import { computed } from 'vue';
import { usePermissionStore } from '@/stores/permission';
export function useAccess() {
const permissionStore = usePermissionStore();
// 判断是否为管理员
const isAdmin = computed(() => permissionStore.roles.includes('admin'));
// 判断是否具有特定权限
const canAccess = (condition) => {
if (typeof condition === 'string') {
return permissionStore.permissions.includes(condition);
}
if (Array.isArray(condition)) {
return condition.some((perm) => permissionStore.permissions.includes(perm));
}
return false;
};
return { isAdmin, canAccess };
}
2.2.2 在组件中使用
<template><div><p v-if="isAdmin">欢迎管理员!</p><button v-if="canAccess('edit')">编辑</button></div></template><script>import { useAccess } from '@/hooks/useAccess';export default {setup() {const { isAdmin, canAccess } = useAccess();return { isAdmin, canAccess };},};</script>

️ 三、React 中的自定义权限 Hook

3.1 使用 Custom Hook 封装 usePermission

3.1.1 设计思路

React中的usePermission与Vue类似,但需要借助useSelectorRedux中读取权限状态。

3.1.2 示例代码解析
// hooks/usePermission.js
import { useSelector } from 'react-redux';
export function usePermission() {
const permissions = useSelector((state) => state.permission.permissions);
// 封装权限判断函数
const hasPermission = (permission) => {
return permissions.includes(permission);
};
// 支持多权限判断
const hasAnyPermission = (permissionsList) => {
return permissionsList.some((perm) => permissions.includes(perm));
};
return { hasPermission, hasAnyPermission };
}
3.1.3 在组件中使用
import React from 'react';
import { usePermission } from './hooks/usePermission';
const UserProfile = () => {
const { hasPermission, hasAnyPermission } = usePermission();
return (
<div><button disabled={!hasPermission('edit')}>编辑</button><button disabled={!hasAnyPermission(['delete', 'admin'])}>删除</button></div>);};export default UserProfile;

3.2 封装 useAccess 实现更高级的权限控制

3.2.1 示例代码解析
// hooks/useAccess.js
import { useSelector } from 'react-redux';
export function useAccess() {
const roles = useSelector((state) => state.permission.roles);
const permissions = useSelector((state) => state.permission.permissions);
// 判断是否为管理员
const isAdmin = roles.includes('admin');
// 判断是否具有特定权限
const canAccess = (condition) => {
if (typeof condition === 'string') {
return permissions.includes(condition);
}
if (Array.isArray(condition)) {
return condition.some((perm) => permissions.includes(perm));
}
return false;
};
return { isAdmin, canAccess };
}
3.2.2 在组件中使用
import React from 'react';
import { useAccess } from './hooks/useAccess';
const UserProfile = () => {
const { isAdmin, canAccess } = useAccess();
return (
<div>{isAdmin && <p>欢迎管理员!</p>}<button disabled={!canAccess('edit')}>编辑</button></div>);};export default UserProfile;

四、权限 Hook 的优化策略

4.1 性能优化

为了避免频繁计算权限状态,可以使用computed(Vue)或useMemo(React)缓存结果。

4.2 动态更新支持

通过监听权限状态的变化,确保Hook能够实时响应权限更新。


五、总结与展望

5.1 本节内容回顾

在本节课中,我们深入探讨了自定义权限Hook的实现方法,涵盖了以下内容:

  1. 自定义权限Hook的核心概念与优势。
  2. 使用Vue 3的Composition API封装usePermissionuseAccess
  3. 使用React的Custom Hook实现权限判断。
  4. 权限Hook的设计思路与优化策略。

5.2 下一步学习建议

掌握了自定义权限Hook后,建议继续学习以下内容:


六、课后练习

  1. 在你的Vue 3项目中实现一个基于Composition APIusePermission
  2. 尝试使用React的Custom Hook封装useAccess
  3. 在实际项目中应用自定义权限Hook,测试其效果。

希望本节课能帮助你全面掌握自定义权限Hook的实现方法!老曹期待在下一节课中与大家探讨更高级的权限管理技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年河北比较好的酒店隔断厂家怎么选择,办公隔断/双玻隔断/自由组合隔断/玻璃隔断/酒店隔断,酒店隔断定制品牌有哪些

随着京津冀地区酒店业持续升级,酒店隔断作为空间功能与美学设计的核心载体,正从“基础分隔”向“智能化、场景化、定制化”转型。据2024年《中国酒店空间设计趋势报告》显示,超70%的酒店改造项目将隔断系统纳入重点…

Day18学成在线网页渲染

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

【计算机毕业设计案例】用Python搭建机器学习模型预测房租价格基于机器学习的房子价值预测系统的设计与实现(程序+文档+讲解+定制)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

2026年知名的N型MOS管,高压MOS管,低压MOS管厂家实力推荐榜

引言在当今科技飞速发展的时代,N 型 MOS 管、高压 MOS 管和低压 MOS 管作为电子领域不可或缺的关键元件,广泛应用于医疗、汽车电子、照明、通讯、智能家居等众多行业。其性能的优劣直接影响着电子设备的稳定性、效率…

最新发布!2025年洁净工作台行业领军厂家排行,快速卷帘门/洁净工作台/净化工程/风淋室/医疗装修工程/洁净棚洁净工作台厂家口碑推荐榜

洁净工作台作为生物医药、微电子、精密制造等高新技术产业不可或缺的基础设备,其性能与可靠性直接关系到研发与生产的成败。随着国内产业升级与质量标准提升,市场对洁净工作台供应商的技术实力、产品品质及综合服务能…

【新】基于SSM的智能车库管理平台【源码+文档+调试】

&#x1f495;&#x1f495;发布人&#xff1a; 星河码客 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&…

我用公司奖励的学习基金买了些什么书

背景介绍 最近我们公司根据上一年在集团在线学习平台的学习时长评选出了年度学习标兵,本人因为经常在学习平台学习课程荣幸当选为学习标兵之一,并且收获了公司800元学习基金的奖励,这部分基金可以用于购买同公司发展…

10336_基于SSM的少数民族文化商城

1、项目包含 项目源码、项目文档、数据库脚本、软件工具等资料; 带你从零开始部署运行本套系统。 2、技术说明 后端:SSM 前端:JSP 数据库:MySql 开发工具:JDK1.8及以上 + Eclipse + MySQL + Maven 本项目涉及多项…

即插即用系列(代码实践)| AAAI 2025 TBSN:基于Transformer的盲点网络——自监督去噪新SOTA,彻底解决注意力机制信息泄露难题

论文题目:Rethinking Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising 中文题目:重新思考用于自监督图像去噪的基于Transformer的盲点网络 论文出处:arXiv 2025 (最新自监督去噪研究) 应用任务:自监督图像去噪 (Self-Supervised Image Denoisin…

2026-01-20

CF Problem - 1829G - Codeforces(dp好题) 状态转移方程: \[f_{i,j}= \begin{cases} 1 & i=1 \\ f_{i-1,j-1} + f_{i-1,j} - f_{i-2,j-1} & i>1 \end{cases} \] 要注意这里需要减去\(f_{i-2,j-1}\)(两者…

大数据毕设项目推荐-基于hadoop的山东瓜果蔬菜分析系统【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

2025年阿胶批发指南:揭秘线下口碑前五强的实力商家,阿胶类/阿胶类产品/阿胶糕/阿胶产品/膏方类产品/膏方/阿胶/非遗膏方阿胶品牌推荐榜单

随着大健康产业的蓬勃发展,阿胶作为传统滋补佳品,市场需求持续旺盛。对于寻求稳定货源与可靠品质的批发商、渠道商及品牌方而言,选择一家实力雄厚、口碑卓著的源头供应商至关重要。线下合作因其深度沟通、实地考察与…

2026深圳燃气热水器售后品牌推荐:百乐满热水器官方电话、百乐满热水器维修电话、百乐满热水器报修电话、百乐满官网选择指南

2026深圳燃气热水器售后品牌推荐:百乐满热水器官方电话、百乐满热水器维修电话、百乐满热水器报修电话、百乐满官网选择指南2026深圳燃气热水器售后品牌推荐:聚焦专业度与安全的3家头部服务商选择指南 对于深圳家庭或…

【毕业设计】基于Python网易云音乐排行榜数据分析系统设计与实现(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

实用指南:如何使用U盘在Windows电脑上按装Fedora43 KDE?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

阿里领导给的Java八股文,包括15条技术线,已助1900人进入大厂

为了更高的薪水跳槽无可厚非&#xff0c;但你要把握好一个度。举个例子&#xff0c;如果你每次都只是为了能增长3%的年薪&#xff0c;而频繁地换工作。当HR看到你的简历时&#xff0c;你会被认为是一个对公司没有忠心、对自己的事业没有远见的人如何准备&#xff1f;除了平时的…

【新】基于SSM的高校自助洗衣系统【源码+文档+调试】

&#x1f495;&#x1f495;发布人&#xff1a; 星河码客 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&…

大数据毕设项目推荐-基于django的城市房产价值的数据分析与预测系统的设计与实现基于Python的智能房价分析与预测系统【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

5款AI PPT工具测评:免费又实用,这些工具值得推荐!

5款AI PPT工具测评&#xff1a;免费又实用&#xff0c;这些工具值得推荐&#xff01;作为一名在职场摸爬滚打多年的打工人&#xff0c;我深知做 PPT 的痛苦。好不容易熬夜把 PPT 做好&#xff0c;结果临到汇报前&#xff0c;领导突然提出新的要求&#xff0c;又得重新修改&…

ros2 run 配置参数

在ROS2中&#xff0c;通过ros2 run配置节点参数主要涉及命令行参数传递、参数文件和Launch文件集成三种方式。以下以ROS2 Jazzy为例详细说明&#xff1a; 1️⃣ 命令行直接传递参数 ros2 run <package_name> <executable_name> \--ros-args \-p <parameter_name…