vue通自定义指令实现按钮权限控制

VUE自定义指令

<script setup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令。在上面的例子中,vFocus 即可以在模板中以 v-focus 的形式使用。

<template>
  <input v-focus />
</template>
<script setup>
// 在模板中启用 v-focus
const vFocus = {
  mounted: (el) => el.focus()
}
</script>

在没有使用 <script setup> 的情况下,自定义指令需要通过 directives 选项注册:

<template>
  <input v-focus />
</template>
<script>
export default {
  setup() {
    /*...*/
  },
  directives: {
    // 在模板中启用 v-focus
    focus: {
      /* ... */
    }
  }
}
</script>

将一个自定义指令全局注册到应用层级

const app = createApp({})

// 使 v-focus 在所有组件中都可用
app.directive('focus', {
  /* ... */
})

权限控制简单例子

main.ts文件

import { registerGlobalDirective } from './directive'
const bootstrap = async ()=>{
	const app = createApp(App)
	registerGlobalDirective(app)
	app.mount('#app')
}

directive/src/auth.ts

/**
 * 将一个自定义指令全局注册到应用层级
 * @Example v-auth=""
 */
import type { Directive, DirectiveBinding } from 'vue'
export interface ContextOptions {
  hasPermission: (
    value?: string | string[] | undefined,
    def?: boolean,
  ) => boolean
}
let context: ContextOptions = {
  hasPermission: () => false,
}
const isAuth = (el: Element, binding: any) => {
  const { value } = binding
    const all_permission = "*:*:*";
    const permissions = ['1','2','3','4','5']//权限数组
    if (value) {
      const permissionFlag = value
      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permission == permissionFlag
      })
      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
}

const mounted = (el: Element, binding: DirectiveBinding<any>) => {
  isAuth(el, binding)
}

const auth: Directive = {
  mounted,
}

export { auth }

directive/index.ts

import type { App } from 'vue'
import { auth } from './src/auth'
export { auth}

export const registerGlobalDirective = (app: App) => {
  app.directive('auth', auth)
}

index.vue文件

<template>
  <div style="height:100vh;">
	<button v-auth="1">按钮</button>
  </div>
</template>
<script setup>

</script>

更多自定义指令例子

分享8个非常实用的Vue自定义指令 (baidu.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值