vue3 directive自定义方法,实现编辑操作的权限控制

directive.js

import store from '../store'
import { message } from "ant-design-vue";

export default (app) => {
    app.directive('click-permit', {
        mounted(el, binding) {
            let auths = store.state.user.roleInfo.auths || []
            let auth = binding.arg
            const clickFn = () => {
                const isAuth = auths.includes(auth)
                if (isAuth) {
                    if (binding.value) {
                        let params = binding.value.params
                        let fn = binding.value.fn
                        fn(params)
                    }

                } else {
                    message.destroy()
                    message.error('无权限')
                }
            }
            el.addEventListener('click', clickFn)
        },

    })
}

main.ts

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store'
import Antd, { message } from "ant-design-vue";
import '@/styles/global.less'
import moment from 'moment'

import directives from './directive'


const app = createApp(App)
app.use(store)
.use(router)
.use(Antd)


directives(app)

app.mount('#app')
var Mock = require('mockjs')
var data = Mock.mock({
    // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
    'list|1-10': [{
        // 属性 id 是一个自增数,起始值为 1,每次增 1
        'id|+1': 1
    }]
})


index.vue

<template>
 
  <a-button
          type="primary"
          v-if="!isEdit"
          v-click-permit:company:update="{ fn: onShowEdit, params: true }"
          >编辑</a-button
        >
 
</template>
<script>
import {
  defineComponent,
  ref,
  onMounted,
} from "vue";

export default defineComponent({

  setup() {
    const onShowEdit = (status) => {
      
    };

    return {
      onShowEdit,
    
    };
  },
});
</script>
<style lang="less" scoped></style>

Vue3 中,你可以通过创建自定义指令来实现按钮的权限控制自定义指令允许你在组件之外定义行为规则,并在需要的地方动态应用。以下是基本步骤: 1. 定义指令: 首先,在 `src/directives` 目录下创建一个文件,如 `permission.js`,并设置一个名为 `v-permission` 的全局指令: ```javascript // permission.js import { DirectiveBinding } from &#39;vue&#39;; const permission = { // 指令名称 name: &#39;v-permission&#39;, // 插值表达式模式 bind(el: HTMLElement, binding: DirectiveBinding) { // 绑定函数,当元素插入文档时执行 const value = binding.value; // 权限状态 el.addEventListener(&#39;click&#39;, function (e) { if (value) { // 如果当前用户有权限 e.preventDefault(); // 阻止默认点击事件(例如提交表单) // 执行你的业务逻辑 // ... } }); }, unbind(el: HTMLElement) { // 解绑函数,当元素从文档中移除时执行 el.removeEventListener(&#39;click&#39;, this.handler); } }; export default permission; ``` 2. 注册指令: 在 main.js 或者其他适当的地方,将自定义指令注册到 Vue 实例上: ```javascript import Vue from &#39;vue&#39;; import permission from &#39;./directives/permission&#39;; // 引入自定义指令 Vue.directive(permission.name, permission); // 注册指令 ``` 3. 使用指令: 在需要控制权限的按钮组件模板中,使用 `v-permission` 指令结合计算属性或Vuex状态管理来传递权限状态: ```html <!-- 组件 template --> <button v-permission="isUserAuthorized">点击查看</button> <script setup> import { ref } from &#39;vue&#39;; import { useStore } from &#39;@your-store/module&#39;; // 根据你的状态管理库 const isUserAuthorized = ref(false); const store = useStore(); store.watch([&#39;userPermissions&#39;], () => { isUserAuthorized.value = store.userPermissions.includes(&#39;view&#39;); // 更新权限状态 }); </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值