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>
相关推荐
TeleostNaCl1 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫3 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友3 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理4 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻5 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front5 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰6 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼987 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮7 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20027 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员