当前位置: 首页 > news >正文

Vue3 实现自定义指令点击空白区域关闭下拉框

一、封装 v-click-outside

在utils文件夹下面创建clickOutside.ts:

import type { DirectiveBinding } from 'vue'type ClickOutsideEl = HTMLElement & {__clickOutsideHandler__?: (e: MouseEvent) => void
}const clickOutside = {mounted(el: ClickOutsideEl, binding: DirectiveBinding) {el.__clickOutsideHandler__ = (e: MouseEvent) => {if (el.contains(e.target as Node)) returnbinding.value(e)}document.addEventListener('click', el.__clickOutsideHandler__)},unmounted(el: ClickOutsideEl) {if (el.__clickOutsideHandler__) {document.removeEventListener('click', el.__clickOutsideHandler__)delete el.__clickOutsideHandler__}}
}export default clickOutside

二、在main.ts里全局注册:

import { createApp } from 'vue'
import App from './App.vue'
import clickOutside from './utils/clickOutside'const app = createApp(App)// 全局注册指令
app.directive('click-outside', clickOutside)app.mount('#app')

三、使用示例

<template><div class="dropdown" v-click-outside="handleClose"><button @click="isOpen = !isOpen">切换菜单</button><ul v-if="isOpen" class="menu"><li>选项1</li><li>选项2</li><li>选项3</li></ul></div>
</template><script setup lang="ts">
import { ref } from 'vue'const isOpen = ref(false)const handleClose = () => {isOpen.value = false
}
</script>
http://www.dtcms.com/a/363528.html

相关文章:

  • 【51单片机】【protues仿真】 基于51单片机智能电子秤系统
  • 工业界实战之数据存储格式与精度
  • 嵌入式解谜日志-网络编程
  • 浏览器面试题及详细答案 88道(56-66)
  • MySQL查询limit 0,100和limit 10000000,100有什么区别?
  • 敏捷规模化管理工具实战指南:如何实现跨团队依赖可视化?
  • 数据库驱动改造加密姓名手机号证件号邮箱敏感信息
  • web自动化测试(selenium)
  • RK-Android15-WIFI白名单功能实现
  • 一次别开生面的Java面试
  • Servlet基础
  • Redisson分布式锁会发生死锁问题吗?怎么发生的?
  • Aurobay EDI 需求分析:OFTP2 与 EDIFACT 驱动的汽车供应链数字化
  • UniApp 实现搜索页逻辑详解
  • uniapp H5预览图片组件
  • 年轻教师开学焦虑破解:从心出发,重构健康工作生活新秩序
  • uni-app 布局之 Flex
  • 第一讲、Kafka 初识与环境搭建
  • ImageMagick命令行图片工具:批量实现格式转换与压缩,支持水印添加及GIF动态图合成
  • windows系统离线安装Ollama、创建模型(不使用docker)、coze调用
  • 51c大模型~合集177
  • Swift 解法详解:LeetCode 369《给单链表加一》
  • 研发团队缺乏统一文档模板怎么办
  • 苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡
  • 【后端】Docker 常用命令详解
  • 构建企业级区块链网络:基于AWS EC2的弹性、高可用解决方案
  • 2025软件测试面试热点问题,3天刷完你的软件测试就牛了
  • 不同编译器之间代码转换
  • Java学习笔记-零基础学MySQL(二)
  • QT C++传递 map 给qml 中访问的两种方式