vue自定义指令

学习目标:

vue自定义指令在项目中的应用


案例全文

javascript 复制代码
import { App } from 'vue'
import router from '@/router'
import { permissionsEnum } from '@/enums/permissions'

// 该指令可以用来拦截元素的点击事件并阻止冒泡,如果绑定的是button元素,则给button添加disabled属性,其他元素会添加一个禁用样式类.custom-disabled
// 如果给指令传值,则根据值真假决定是否开启禁用
// 如果没给指令传值,则根据当前路由权限,决定是否开启禁用
// 如果元素或组件自身有disabled属性,可直接用其自带的disabled属性来决定是否开启禁用
// 如果元素或组件自身没有disabled属性,可用使用该指令
const disabledDir = (el: HTMLElement, binding: any) => {
  const permissions = router.currentRoute.value.meta?.permissions
  console.log('el:', el)
  console.log('binding:', binding)
  let disabled = false

  // 判定为没传指令值
  if (binding.value === undefined) {
    // 没传指令值
    disabled = permissions === permissionsEnum.view
  } else {
    // 传指令值了
    disabled = binding.value
  }

  if (disabled) {
    // 阻止点击事件
    el.addEventListener(
      'click',
      (event: MouseEvent) => {
        event.stopPropagation()
        event.preventDefault()
      },
      true
    )
    if (el instanceof HTMLButtonElement) {
      el.disabled = true
    } else {
      el.classList.add('custom-disabled')
    }
  }
}

export function installPermissions(app: App): App {
  app.directive('disabled', disabledDir)
  return app
}

1:声明一个函数用来处理权限信息

disabledDir 该函数接收**el: HTMLElement, binding: any,**dom元素和自定义传参

  • 当没有自定义传参时,获取router中的权限信息;
  • 当有自定义传参时,根据传参值,判断可不可以点击
  • 添加addEventListener监听事件,按钮添加disabled属性,不是按钮添加自定义样式

2:自定义指令

在vue中添加自定义指令

javascript 复制代码
function installPermissions(app: App): App {
  app.directive('disabled', disabledDir)
  return app
}

然后把该函数挂载到vue实例,就可以在项目中使用了。

3:使用

javascript 复制代码
<a-button v-disabled="userStore.user.roleType === 0" type="primary" style="margin-left: 20px" @click="edit" > 编辑 </a-button>
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端