vue3实现鼠标右键显示菜单,点击其他地方消失问题

 更新时间:2024年04月26日 09:30:30   作者:一个无所事事的程序猿  
这篇文章主要介绍了vue3实现鼠标右键显示菜单,点击其他地方消失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue3触发鼠标右键的回调函数

在标签上加上 @contextmenu=“contextmenu” 即可

<div @contextmenu="contextmenu" class="contextmenu"></div>

显示我们定义的菜单

去掉浏览器默认的菜单

  • 通过 preventDefault api
e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  • 定义一个菜单页面
  <div class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" >
    <span>删除聊天</span>
  </div>

这个页面绑定isShowMenu变量用来显示或不显示菜单,通过fixedBoxStyleObject变量来设置菜单的位置

  • 定义触发的回调函数
const contextmenu = (e) => {
  e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  fixedBoxStyleObject.left = e.clientX + 'px'
  fixedBoxStyleObject.top = e.clientY + 'px'
  isShowMenu.value = true
}

点击其他地方菜单消失

一般我们用设置焦点和失去焦点触发事件来完成这个功能,例如:

在右键时设置焦点,那么当点击其他地方时就会触发失去焦点事件,在调用回调函数即可

  • 优化template部分
  <div tabindex="-1" class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" @blur="isShowMenu = false" ref="fixedBoxRef">
    <span>删除聊天</span>
  </div>
  • 优化scipt部分
const contextmenu = (e) => {
  e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  fixedBoxStyleObject.left = e.clientX + 'px'
  fixedBoxStyleObject.top = e.clientY + 'px'
  isShowMenu.value = true
  setTimeout(() => {
      fixedBoxRef.value.focus()
  },1)
}

tips:

  • 由于div本身不能获取焦点,但设置tabindex后便可以获取焦点
  • 设定一个定时器的原因是dom从不显示到显示需要时间,必须得显示后才能获取焦点

css部分

.fixed-box{
  position: fixed;
  color: black;
  padding: 8px;
  width: fit-content;
  background-color: #F8F8F8;
}
.contextmenu{
	width:300px;
	height:300px;
  margin: 100px auto;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue2响应式原理之Object.defineProperty()方法的使用

    vue2响应式原理之Object.defineProperty()方法的使用

    这篇文章主要介绍了vue2响应式原理之Object.defineProperty()方法的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue2中使用Monaco Editor的教程详解

    Vue2中使用Monaco Editor的教程详解

    Monaco-editor,一个vs code 编辑器,这篇文章主要为大家详细介绍了如何在Vue2中使用Monaco Editor,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 关于this.$refs获取不到dom的可能原因及解决方法

    关于this.$refs获取不到dom的可能原因及解决方法

    这篇文章主要介绍了关于this.$refs获取不到dom的可能原因及解决方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • @click.native和@click的区别及说明

    @click.native和@click的区别及说明

    这篇文章主要介绍了@click.native和@click的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 在vue项目中封装echarts的步骤

    在vue项目中封装echarts的步骤

    这篇文章主要介绍了在vue项目中封装echarts的步骤,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • 使用vue.js制作分页组件

    使用vue.js制作分页组件

    本文给大家分享的是个人在使用vue.js制作的文章和评论的分页组件,并使用webpack打包起来,这里推荐给大家,有需要的小伙伴可以参考下
    2016-06-06
  • 关于Ant-Design-Vue快速上手指南+排坑

    关于Ant-Design-Vue快速上手指南+排坑

    这篇文章主要介绍了关于Ant-Design-Vue快速上手指南+排坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 利用vue.js实现被选中状态的改变方法

    利用vue.js实现被选中状态的改变方法

    下面小编就为大家分享一篇利用vue.js实现被选中状态的改变方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Vue如何实现自动触发功能

    Vue如何实现自动触发功能

    这篇文章主要介绍了Vue如何实现自动触发功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Vue3.2 新增指令 v-memo 用法详解(提高性能利器)

    Vue3.2 新增指令 v-memo 用法详解(提高性能利器)

    v-memo 接受一个依赖的数组,依赖的数组变化,v-memo 所对应的 DOM 包括子集将会重新渲染,这篇文章主要介绍了Vue3.2 新增指令 v-memo 用法,提高性能的又一利器,需要的朋友可以参考下
    2022-09-09

最新评论