vue3 组件级权限控制

简介: vue3 组件级权限控制

权限控制程度分为:1. 页面级 2. 组件级 3. 代码级

1. 页面级

这是大部分前端遇到的级别。依靠路由守卫,如果没有权限,就看不到菜单,就进不到页面。不会给页面带来侵入性。什么是侵入性,就是写页面组件的时候,还要考虑权限。

2. 组件级

有没有权限都可以看到页面组件,但是不同权限的人,看到的东西不同。比如按钮,没有权限的操作不了,或者看不到这个按钮。这就会产生一些侵入性,写页面组件的时候,需要考虑到权限。

我们现在要做的就是尽量减少组件级权限控制带来的侵入性。如果权限只是控制可见度的话,我们还可以做优化,如果是不同权限,点击按钮调用不同函数的话,那就不好优化了。现在针对第一种情况来优化。

我们可以用一个权限组件将需要权限控制的组件包裹住。给属性 permissions 传入参数 ,如果权限包含 'sys:user:add' 就显示按钮。

<Authority permissions="sys:user:add">
  <button>新增用户</button>
</Authority>
 
<Authority :permissions="['sys:user:view', 'sys:user:update']">
  <button>新增用户</button>
</Authority>

如果权限控制的不是显示隐藏,而是控制的能否点击呢,我们这个组件可以交还一些控制权,让开发人员根据情况去控制。通过作用域插槽,返回用户的所有权限 userPermissions。

<Authority>
  <template #default="{ userPermissions }">
    <button :disabled="!userPermissions.includes('sys:user:add')">新增用户</button>
  </template>
</Authority>

我们这个组件提供了两个功能:一个预设的可见不可见,一个让开发者自行处理。代码如下:

<template>
  <slot v-if="showSlot" :userPermissions="permissions"></slot>
</template>
 
<script setup>
  import { computed } from "vue";
  import { useAuth } from "./useAuth.js";
 
  const props = defineProps({
    permission: {
      type: [String, Array],
    },
  });
 
  const { permissions } = useAuth();
  const showSlot = computed(() => {
    if (!props.permission) {
      // 没传入权限,直接显示
      return true;
    }
    if (!permissions) {
      // 没有任何权限,直接隐藏
      return false;
    }
 
    if (Array.isArray(props.permission)) {
      return props.permission.every((p) => permissions.includes(p));
    } else {
      return permissions.includes(props.permission);
    }
  });
</script>

3. 代码级(函数级)

哪些权限的人可以调用这个函数,哪些不可以。或者调这个函数产生不同的结果。但是这种情况很少。

目录
相关文章
|
7天前
|
JavaScript 网络架构
vue3 Elementplus 动态路由菜单不跳转问题
vue3 Elementplus 动态路由菜单不跳转问题
25 1
|
7天前
|
JavaScript 前端开发 API
vue3和vue2的区别
vue3和vue2的区别
|
7天前
|
JavaScript API 开发者
vue3 的生命周期
vue3 的生命周期
|
15小时前
|
JavaScript
文本,wangEditor5的基本使用,开发文档地址,wangEditor5用于Vue3项目,想要使用好wangEditor项目,得看开发文档
文本,wangEditor5的基本使用,开发文档地址,wangEditor5用于Vue3项目,想要使用好wangEditor项目,得看开发文档
|
1天前
|
JavaScript 测试技术
Vue开发项目过程中环境变量的配置(vite、vue3、ts)
Vue开发项目过程中环境变量的配置(vite、vue3、ts)
6 0
|
2天前
|
JavaScript 数据安全/隐私保护
vue 页面权限控制、按钮权限控制
vue 页面权限控制、按钮权限控制
4 0
Vue3组件,注册全局组件和局部组件
Vue3组件,注册全局组件和局部组件
|
6天前
技术笔记:Vue3之emits
技术笔记:Vue3之emits
|
17小时前
|
JavaScript 索引
Component name “index“ should always be multi-word vue/multi-word-component-names
Component name “index“ should always be multi-word vue/multi-word-component-names