Vue 3 自定义权限指令 v-action

在实际的前端开发中,尤其是涉及到权限管理的系统,我们经常需要根据用户的权限动态控制某些按钮的显示和隐藏。例如:在一个后台管理系统中,不同角色的用户可能拥有不同的操作权限,比如「查看」、「编辑」、「删除」等。为了避免用户无权操作某些功能,通常需要在组件或模板中手动添加权限判断逻辑。

然而,如果在每个需要权限控制的地方都手写 v-if 或 v-show 来判断,代码会变得冗余且难以维护。为了解决这个问题,可以利用 Vue 3 的自定义指令 来封装权限控制逻辑,使得权限管理变得更直观、可复用,进而提升代码的可读性和可维护性。

举出一个实际可用的 🌰

javascript 复制代码
/**
 * 根据权限(binding)决定 el 的显示隐藏
 * @param {*} el 指令绑定的 DOM 元素,Vue 传递给指令的 el 参数
 * @param {*} binding 指令的绑定值对象,包含传递指令的值。比如:v-action="'actionCode'",那么 binding.value 就是 'actionCode'。
 * @returns
 */
function updateVisibility(el, binding) {
  // 获取权限列表
  const { _actions } = window;

  // 如果没有指定权限值,默认「显示」
  if (!binding.value) {
    el.style.display = '';
    return;
  }

  // 根据权限判断是否隐藏
  el.style.display = _actions && !_actions.includes(binding.value) ? 'none' : '';
}

// action:自定义指令对象
const action = {
  // 指令绑定的元素被插入到 DOM 时触发
  mounted(el, binding) {
    updateVisibility(el, binding);
  },
  // 当组件 props 或 data 发生变化导致 DOM 更新 时触发。
  updated(el, binding) {
    updateVisibility(el, binding);
  },
};

// 注册全局指令
export default {
  install(app) {
    // 在 Vue 应用上 注册全局指令 v-action,让所有组件都可以使用 v-action 来控制元素的显示。
    app.directive('action', action);
  },
};

这个代码是一个 Vue 3 的自定义指令(v-action), 用于根据用户的权限控制元素的显示与隐藏。它会在 mounted 和 updated 阶段检查权限,并根据权限决定是否显示元素。

​​​​​​​🌟总结

v-action 这个指令的作用是 根据用户权限 (window._actions) 控制元素的显示。

  • 用户没有权限 → 隐藏该元素(display: none)。
  • 用户有权限 → 显示该元素(display: '')。
  • 没有传递 v-action 的值 → 默认显示。

​​​​​​​🌟 使用方式

在 Vue 组件的模板中:

html 复制代码
<template>
  <button v-action="'_EDIT'">编辑</button>
</template>

只有 _actions 数组包含 '_EDIT',按钮才会显示。如果 window._actions 不包含 '_EDIT',按钮会被隐藏。

这个代码在 Vue 3 项目里非常实用,特别适用于 权限控制场景!

相关推荐
天若有情6731 分钟前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
天***88524 分钟前
Edge 浏览器离线绿色增强版+官方安装包,支持win7等系统
前端·edge
漫游的渔夫13 分钟前
别再直接 `json.loads` 了!AI 返回的 JSON 坑位指南
前端·人工智能
软件工程师文艺25 分钟前
从0到1:Claude Code如何用React构建CLI应用
前端·react.js·前端框架
M ? A34 分钟前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix35 分钟前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
Burt1 小时前
我的 2026 全栈选型:Vue3 + Elysia + Bun + AlovaJS
vue.js·全栈·bun
止观止1 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext
沃尔威武1 小时前
调试黑科技:Chrome DevTools时间旅行调试实战
前端·科技·chrome devtools
小锋java12341 小时前
SpringBoot 4 + Spring Security 7 + Vue3 前后端分离项目设计最佳实践
java·vue.js·spring boot