Vue自定义v-has指令实现按钮权限判断
以后台管理系统为例,每个用户所拥有的按钮权限不一样。管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮。 简单说一下,自定义指令
Vue.js官网关于自定义指令的讲解 cn.vuejs.org/v2/guide/cu… 基础概念 Vue除了核心功能默认内置的指令(v-model和v-show)还可以注册自定义指令。 在Vue2.0中,代码复用和抽象的主要形式是组件。但有的情况下,仍需要对普通DOM元素进行底层操作,这时候就会用到自定义指令。 譬如,自定义一个v-focus指令,当页面加载时,输
Vue.js 是一款流行的前端框架,它允许开发者通过声明式的方式构建用户界面。在某些场景下,Vue 提供的内置指令(如 v-model 和 v-show)无法满足特定需求,此时可以通过自定义指令(Custom Directives)来进行扩展。Vue 自定义指令允许开发者在底层操作 DOM 元素,提供更灵活的功能。
在本文档中,我们将关注如何创建一个名为 `v-has` 的自定义指令,用于后台管理系统的按钮权限判断。通常,后台管理系统中不同用户拥有不同的权限,管理员会配置这些权限,用户登录后,从服务器获取到按钮权限列表并据此显示或隐藏相应的按钮。
让我们了解自定义指令的基本结构。Vue 提供了以下几种生命周期钩子函数:
1. **bind**:指令首次绑定到元素时调用,用于一次性初始化设置。
2. **inserted**:被绑定元素插入到其父节点时调用,但不保证已插入文档中。
3. **update**:所在组件的 VNode 更新时调用,可能会在子 VNode 更新之前,可用于根据值变化更新模板。
4. **componentUpdated**:所在组件的 VNode 及其子 VNode 全部更新后调用。
5. **unbind**:指令与元素解绑时调用,用于清理资源。
下面是一个简单的自定义指令 `v-focus` 示例,用于使绑定元素在页面加载时获得焦点:
```javascript
// 全局注册
Vue.directive('focus', {
inserted: function (el) {
el.focus()
}
})
// 局部注册
directives: {
focus: {
inserted: function (el) {
el.focus()
}
}
}
```
现在回到我们的 `v-has` 指令,这个指令的目的是根据用户的按钮权限列表决定是否显示元素。权限数据通常以 JSON 格式存储,包含按钮的 ID、名称、权限码等信息。例如:
```json
[
{
"id": "1503273153861066776",
"name": "今日采集(案卷)",
"permission": "sys:index:vol"
},
// ...
]
```
在用户登录时,这些数据会被存入本地缓存,例如 `LOGIN_USER_BUTTON_AUTH`。我们的 `v-has` 指令会检查元素上的权限属性与用户权限列表中的权限码是否匹配,如果匹配则显示该元素。
下面是如何配置 `v-has` 指令的示例:
```javascript
Vue.directive('has', {
inserted: function (el, binding, vnode) {
const userPermissions = localStorage.getItem('LOGIN_USER_BUTTON_AUTH') || []
if (userPermissions.some(permission => permission === binding.value)) {
el.style.display = 'block'
} else {
el.style.display = 'none'
}
}
})
```
在这个例子中,`binding.value` 代表指令参数,即按钮的权限码。在 `inserted` 钩子中,我们从本地缓存获取用户权限列表,然后检查是否有与指令参数匹配的权限。如果有,按钮将显示;否则,按钮将隐藏。
通过这种方式,我们可以确保用户只能看到和操作他们被授权的按钮,提高了后台管理系统的安全性与用户体验。记住,自定义指令应谨慎使用,因为它们涉及到底层 DOM 操作,可能会导致性能问题。在多数情况下,使用组件和计算属性更能体现 Vue 的设计哲学。