el-tbs 权限控制
1. 需求
- 需求:实现一个 el-tabs 的权限控制,只有管理员才能操作,普通用户既看不到也不能操作
2. 分析
一般要实现按钮权限控制都是使用封装指令 v-permission 指令,但是类似“Tabs”这类组件不能使用 v-permission 指令实现权限控制。
因为 v-permission 底层是实现 dom 的删除,而不是像 el-tab-pane 这种组件删除,这种组件后面渲染可能会产生更多的 dom 或者是容器。所以,这种可以使用 v-if 来删除。
3. 实现思路(一)
-
实现思路: 使用 v-if 来控制组件的显示和隐藏
-
步骤:
- 定义一个变量,用来判断当前用户是否是管理员
- 在 el-tabs 的 data 中定义一个变量,用来判断当前用户是否是管理员
- 在 el-tabs 的 template 中使用 v-if 来控制组件的显示和隐藏
代码实现
<template>
<el-tabs v-model="activeName" type="card">
<el-tab-pane v-if="isAdmin" label="用户管理" name="user">
<el-button type="primary">用户管理</el-button>
</el-tab-pane>
<el-tab-pane v-if="isAdmin" label="角色管理" name="role">
<el-button type="primary">角色管理</el-button>
</el-tab-pane>
<el-tab-pane v-if="isAdmin" label="权限管理" name="permission">
<el-button type="primary">权限管理</el-button>
</el-tab-pane>
</el-tabs>
</template>
4. 实现思路(二)
- 实现思路: 使用 v-for 来控制组件的显示和隐藏
- 步骤:
- 定义一个变量,用于存储 el-tab-pane 组件的数组
- 封装一个过滤函数,用来判断当前用户是否是具有权限
- 在 el-tabs 的 template 中使用 v-for 来控制组件的显示和隐藏
- 使用过滤函数进行权限过滤
代码实现
<el-tabs class="demo-tabs" @tab-change="changeTab">
<el-tab-pane
v-for="item in options.tabs.filter(item => checkPermission(item.premission))"
:key="item.value"
:label="item.label"
:name="item.value"
lazy
>
<component :is="item.comName"></component>
</el-tab-pane>
</el-tabs>
import { ComA, ComB } from "./components";
import checkPermission from "@/hooks/permisson";
// tabs选项
const options = reactive({
tabs: [
{
label: "A",
value: "comA",
// 组件
comName: markRaw(ComA),
premission: true,
},
{
label: "B",
value: "comB",
comName: markRaw(ComB),
premission: "operation:comb:show",
},
],
});
过滤函数
import { useUserStore } from "@/pinia";
const checkPermission = (permission) => {
//如果传入布尔值true,则直接返回true
if (permission === true) return true;
const userStore = useUserStore();
// 判断是否具有权限
if (userStore.buttons.includes(permission)) {
return true;
}
return false;
};
export default checkPermission;