vue按钮权限

原生elementUI中的el-tree树形控件在点击子树后是不能获取到父节点的,需要改变其源码才行

javascript 复制代码
vue elementUI tree树形控件获取父节点ID的实例
修改源码:
情况1: element-ui没有实现按需引入打包
 node_modules\element-ui\lib\element-ui.common.js    25382行修改源码  去掉 'includeHalfChecked &&'
 // if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {
 if ((child.checked || child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {
情况2: element-ui实现了按需引入打包
 node_modules\element-ui\lib\tree.js    1051行修改源码  去掉 'includeHalfChecked &&'
 // if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {
 if ((child.checked || child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {

展示相应按钮

  1. 使用vuex管理权限
javascript 复制代码
// store/modules/user.js
const state = {
  permissions: [] // 权限列表,例如 ['VIEW_DASHBOARD', 'EDIT_PROFILE']
};

const mutations = {
  SET_PERMISSIONS(state, permissions) {
    state.permissions = permissions;
  }
};

const actions = {
  fetchPermissions({ commit }) {
    // 这里模拟从服务器获取权限
    const permissions = ['VIEW_DASHBOARD', 'EDIT_PROFILE'];
    commit('SET_PERMISSIONS', permissions);
  }
};

const getters = {
  hasPermission: (state) => (permission) => {
    return state.permissions.includes(permission);
  }
};

export default {
  state,
  mutations,
  actions,
  getters
};
  1. 在组件中根据权限显示按钮
javascript 复制代码
<template>
  <div>
    <button v-if="hasPermission('EDIT_PROFILE')">Edit Profile</button>
    <button v-if="hasPermission('VIEW_DASHBOARD')">View Dashboard</button>
  </div>
</template>

<script>
export default {
  computed: {
    hasPermission() {
      return this.$store.getters.hasPermission;
    }
  }
};
</script>
  1. 通过全局指令展示按钮
    可以创建一个自定义指令来根据权限动态显示或隐藏元素。

a. 创建自定义指令

javascript 复制代码
export default {
  install(Vue) {
    Vue.directive('permission', {
      bind(el, binding, vnode) {
        const permissions = binding.value;
        const userPermissions = vnode.context.$store.getters.permissions; // 从 Vuex 获取权限

        if (!permissions.some(permission => userPermissions.includes(permission))) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      }
    });
  }
};

b. 在main.js中注册

javascript 复制代码
import PermissionDirective from './directives/permission';

Vue.use(PermissionDirective);

c. 在组件中使用

javascript 复制代码
<template>
  <div>
    <button v-permission="['EDIT_PROFILE']">Edit Profile</button>
    <button v-permission="['VIEW_DASHBOARD']">View Dashboard</button>
  </div>
</template>
相关推荐
winfredzhang5 小时前
为长阅读而生:我做了一个「安静」的 PDF 阅读器
pdf·html
梦帮科技5 小时前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
爱勇宝6 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
微信开发api-视频号协议7 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
甲维斯7 小时前
Fable5:20美金的顶级设计师!
前端·人工智能
kyriewen7 小时前
我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
前端·ai编程·claude
Jackson__7 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
闲猫7 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅8 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒8 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端