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

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

🌲 自定义权限 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.jsimport{ computed }from'vue';import{ usePermissionStore }from'@/stores/permission';exportfunctionusePermission(){const permissionStore =usePermissionStore();// 封装权限判断函数consthasPermission=(permission)=>{return permissionStore.permissions.includes(permission);};// 支持多权限判断consthasAnyPermission=(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';exportdefault{setup(){const{ hasPermission, hasAnyPermission }=usePermission();return{ hasPermission, hasAnyPermission };},};</script>

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

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

🔸 2.2.1 示例代码解析
// hooks/useAccess.jsimport{ computed }from'vue';import{ usePermissionStore }from'@/stores/permission';exportfunctionuseAccess(){const permissionStore =usePermissionStore();// 判断是否为管理员const isAdmin =computed(()=> permissionStore.roles.includes('admin'));// 判断是否具有特定权限constcanAccess=(condition)=>{if(typeof condition ==='string'){return permissionStore.permissions.includes(condition);}if(Array.isArray(condition)){return condition.some((perm)=> permissionStore.permissions.includes(perm));}returnfalse;};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';exportdefault{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.jsimport{ useSelector }from'react-redux';exportfunctionusePermission(){const permissions =useSelector((state)=> state.permission.permissions);// 封装权限判断函数consthasPermission=(permission)=>{return permissions.includes(permission);};// 支持多权限判断consthasAnyPermission=(permissionsList)=>{return permissionsList.some((perm)=> permissions.includes(perm));};return{ hasPermission, hasAnyPermission };}
🔸 3.1.3 在组件中使用
import React from'react';import{ usePermission }from'./hooks/usePermission';constUserProfile=()=>{const{ hasPermission, hasAnyPermission }=usePermission();return(<div><button disabled={!hasPermission('edit')}>编辑</button><button disabled={!hasAnyPermission(['delete','admin'])}>删除</button></div>);};exportdefault UserProfile;

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

🔸 3.2.1 示例代码解析
// hooks/useAccess.jsimport{ useSelector }from'react-redux';exportfunctionuseAccess(){const roles =useSelector((state)=> state.permission.roles);const permissions =useSelector((state)=> state.permission.permissions);// 判断是否为管理员const isAdmin = roles.includes('admin');// 判断是否具有特定权限constcanAccess=(condition)=>{if(typeof condition ==='string'){return permissions.includes(condition);}if(Array.isArray(condition)){return condition.some((perm)=> permissions.includes(perm));}returnfalse;};return{ isAdmin, canAccess };}
🔸 3.2.2 在组件中使用
import React from'react';import{ useAccess }from'./hooks/useAccess';constUserProfile=()=>{const{ isAdmin, canAccess }=useAccess();return(<div>{isAdmin &&<p>欢迎管理员!</p>}<button disabled={!canAccess('edit')}>编辑</button></div>);};exportdefault 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后,建议继续学习以下内容:

  • 动态权限更新:支持实时更新权限状态。
  • 多Tab状态同步:解决多浏览器标签页间的权限状态同步问题。
  • 权限状态的安全性:防止客户端篡改权限数据。

🎯 六、课后练习

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

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

Read more

Android Studio集成GitHub Copilot与GPT-4:提升开发效率的实战指南

快速体验 在开始今天关于 Android Studio集成GitHub Copilot与GPT-4:提升开发效率的实战指南 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 Android Studio集成GitHub Copilot与GPT-4:提升开发效率的实战指南 背景与痛点 作为一名Android开发者,你是否经常遇到这些场景? * 每次新建项目都要重复编写相似的BaseActivity模板代码 * 实现RecyclerView适配器时总在重复劳

微软 Copilot Cowork 深度解析:用 Kotlin + 147API 手搓一个 AI Agent

微软 Copilot Cowork 深度解析:用 Kotlin + 147API 手搓一个 AI Agent

微软最近发布的 Copilot Cowork 在技术圈炸开了锅。它变了。它不再是那个只会补全代码的插件,而是变成了你的 “Coworker”(同事)。基于 Anthropic 的 Claude 构建,它现在能像真人一样处理复杂任务。 作为开发者,我们不仅要会用,更要懂得背后的原理。今天我们就来拆解一下 Copilot Cowork 的核心逻辑,并教你如何利用 Kotlin 和 147API 构建一个属于自己的简易 AI Agent。 从 Chatbot 到 Agent 传统的 Copilot 就像一个实习生,你给它一个指令,它执行一个动作。而 Copilot Cowork 更像是一个成熟的合作伙伴。它具备了 感知(Perception)、规划(Planning) 和 执行(Execution)

DeepSeek、Kimi、笔灵谁最好用?5款网文作者亲测的AI写作神器横评

DeepSeek、Kimi、笔灵谁最好用?5款网文作者亲测的AI写作神器横评

作为在网文圈一路摸爬滚打过来的我,面对“AI写小说”这个现象,心情其实挺复杂的。 这有点像工业革命时期的纺织工人看着蒸汽机——恐惧是真的,但效率的碾压也是真的。 不是纯用AI生成,而是用AI搭建了极其高效的“外挂工作流”。 有人用它日更两万字,有人用它把废稿救活。 当然,不是纯用AI生成,而是用AI搭建了极其高效的“外挂工作流”。为了不让大家白给工具交学费,我实测了市面上十几款软件,挑出了这5款真正能嵌入小说创作流的“神器”。 1️⃣ DeepSeek:除了逻辑强,它还很懂中式网文 适合人群: 玄幻、仙侠、古言作者,以及看重文章设定和逻辑的人。 直通车:https://www.deepseek.com/ 很多人吹DeepSeek的逻辑和代码能力,但在写小说上,它有一个小众的用法是做体系。 👉 独家用法: 你可以用它来写“设定集”和“功法体系”。你可以参考图片中我的指令来和它对话: 它吐出来的东西,特有那味,既有传统网文的爽感,又有你指令里要的感觉。所以虽然它的逻辑能力也在线,但你也不要忽略了它在描写和设定生成上的亮点!