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

vue组件中实现鼠标右键弹出自定义菜单栏

目录

一、背景

二、步骤分析

2.1、监听鼠标右键事件

2.2、自定义弹出框

三、实现效果


一、背景

        最近在写一个聊天程序,要实现点击鼠标右键弹出相关的操作菜单栏,以实现相关功能的拓展。这里主要是记录下,如何在vue项目中实现这种功能。

二、步骤分析

2.1、监听鼠标右键事件

        首先,我们需要阻止原默认的鼠标右键事件,弹出我们自定义的相关菜单。这里想到可以使用JavaScript的dom监听器来实现此功能。

// 监听快捷键事件,回调参数事件event
onMounted(() => {document.addEventListener('contextmenu', clickRightMouse)}
)onUnmounted(() => {document.removeEventListener('contextmenu', clickRightMouse)}
)// 鼠标右键监听
function clickRightMouse(event){// 阻止默认事件触发event.preventDefault();// 编写触发自定义逻辑
}

        后面从网上查询了相关资料,发现vue有简写的语法糖,等效使用JavaScript监听器实现的功能实现。

<!-- @contextmenu vue语法糖等效JavaScript对应的监听器 -->
<!-- .prevent vue事件修饰符,自动阻止默认事件运行 -->
<!-- handleRightClick 自定义事件运行逻辑 -->
<div @contextmenu.prevent="handleRightClick"></div>

2.2、自定义弹出框

        点击鼠标右键,在光标所在位置的右侧弹出操作菜单,点击操作按钮,实现对应的操作逻辑。这里重要的是要在弹出框出现前,计算出弹出层的宽高位置。弹出框可以使用position: fiexd; 配合事件回调取出光标位置。

<template><div class="contactGroupList" @contextmenu.prevent="openMenu"><!-- 动态菜单 --><teleport to=".contactGroupList" :defer="true"><divv-show="isShowMenu"class="context-menu":style="{ top: `${mousePosition.y}px`, left: `${mousePosition.x}px` }"><ul><li @click="handleAction('addGroup')"><el-icon><Plus /></el-icon>添加分组</li><li @click="handleAction('deleteGroup')"><el-icon><DeleteFilled /></el-icon>删除分组</li><li @click="handleAction('manageGroup')"><el-icon><EditPen /></el-icon>重命名分组</li></ul></div></teleport><div>
</template><script setup>
import { ref, reactive, markRaw, onBeforeMount, watch } from 'vue'// 右键打开自定义菜单
const isShowMenu = ref(false)
const mousePosition = ref({ x: 0, y: 0 })const openMenu = (e) => {mousePosition.value = {x: e.clientX,y: e.clientY,}isShowMenu.value = truedocument.addEventListener('click', closeMenu)
}const closeMenu = () => {isShowMenu.value = falsedocument.removeEventListener('click', closeMenu)
}const handleAction = (action) => {alert(`执行操作:${action}`)closeMenu()
}
</script><style lang='scss' scoped>
.contactGroupList {width: 100%;height: 100%:display: flex;flex-direction: column;// 联系人鼠标右键弹出菜单样式(弹出框挂载在contactList下的).context-menu {position: fixed;background: white;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);border-radius: 4px;z-index: 1000;font-size: 14px;}.context-menu ul {list-style: none;padding: 0;margin: 0;min-width: 120px;}.context-menu li {padding: 8px 12px;cursor: pointer;line-height: 100%;display: flex;flex-direction: row;gap: 5px;}.context-menu li:hover {background: #f5f5f5;}
}
</style>

三、实现效果

http://www.dtcms.com/a/362211.html

相关文章:

  • 智慧交通时代,数字孪生为何成为关键力量?
  • Map接口
  • 基于若依框架前端学习VUE和TS的核心内容
  • 手搓3D轮播图组件以及倒影效果
  • 基于STM32的ESP8266连接华为云(MQTT协议)
  • leetcode46.全排列
  • java web 练习 简单增删改查,多选删除,包含完整的sql文件demo。生成简单验证码前端是jsp
  • (Mysql)MVCC、Redo Log 与 Undo Log
  • C#知识学习-012(修饰符)
  • Python OpenCV图像处理与深度学习:Python OpenCV边缘检测入门
  • FastLED库完全指南:打造炫酷LED灯光效果
  • 【Excel】将一个单元格内​​的多行文本,​​拆分成多个单元格,每个单元格一行​​
  • 【设计模式】--重点知识点总结
  • C++ Bellman-Ford算法
  • Linux并发与竞争实验
  • 软件使用教程(四):Jupyter Notebook 终极使用指南
  • 数据分析编程第八步:文本处理
  • 设计模式-状态模式 Java
  • 华清远见25072班I/O学习day2
  • PostgreSQL备份指南:逻辑与物理备份详解
  • 椭圆曲线群运算与困难问题
  • 【数据分享】多份土地利用矢量shp数据分享-澳门
  • AI产品经理面试宝典第81天:RAG系统架构演进与面试核心要点解析
  • Qt中的信号与槽机制的主要优点
  • 自动化测试时,chrome浏览器启动后闪退的问题
  • 【趣味阅读】Python 文件头的秘密:从编码声明到 Shebang
  • VisionProC#联合编程相机实战开发
  • 【云存储桶安全】怎么满足业务需求,又最大程度上满足信息安全要求呢?
  • 1792. 最大平均通过率
  • 学习:uniapp全栈微信小程序vue3后台-暂时停更