vue实现点击右键出现自定义操作菜单

这篇具有很好参考价值的文章主要介绍了vue实现点击右键出现自定义操作菜单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

vue右键弹出菜单,VUE,vue.js,javascript,前端
vue右键弹出菜单,VUE,vue.js,javascript,前端

实现像微信一样的点击右键后出现操作菜单,对选中的数据项进行相应的操作,接下来介绍使用原生vue实现右键菜单的方法。

二、页面代码

<div v-if="isShow" class="warn_box">
   <div
     v-for="(item, index) in warnList"
     :key="index"
     :class="{ 'list': true, 'isTop': item.isTop, 'isSelected': activeIndex === index }"
     @click="itemClick(index, Number(item.code))"
     @contextmenu.prevent.stop="showMenu($event, index, item.configId)"
   >
     <!-- {{ item.name }} -->
     <div
       class="all"
     >
       <div class="left">
         <div class="left_top">
           <EllipsisPop :content="item.name" :row-num="1" width="180px"></EllipsisPop>
         </div>
         <div class="left_bottom">{{ item.code }}</div>
       </div>
       <div class="right">
         <div class="right_top">{{ filterTime(item.maxCreateTime) }}</div>
         <div
           v-if="item.untreatedTotal"
           class="right_bottom"
         >
           <el-badge
             :value="item.untreatedTotal"
             :max="999"
             class="badge"
           >
           </el-badge>
         </div>
       </div>
     </div>
   </div>
   <div v-if="isShowMenu" class="menu_box" :style="{'left': menuLeft + 'px', 'top': menuTop + 'px'}">
     <div class="menu">
       <div v-if="!isNowTop" class="menu_item item_text" @click.stop="stick(true)">置顶</div>
       <div v-else class="menu_item item_text" @click.stop="stick(false)">取消置顶</div>
       <!-- <div class="menu_item item_text" @click.stop="deleteList">删除</div> -->
       
       <el-popover v-model="showDelPop" placement="top" width="160" trigger="click">
         <!-- <p>请确定是否删除?</p> -->
         <div style="text-align: center; margin: 0">
           <p>请确定是否删除?</p>
           <el-button size="small" @click="showDelPop = false">取消</el-button>
           <el-button type="primary" size="small" @click.stop="deleteList">确定</el-button>
         </div>
         <template #reference>
           <div class="menu-item item_text" @click.stop="()=>{}">删除</div>
         </template>
       </el-popover>
     </div>
   </div>
 </div>

.menu_box {
  position: fixed;
  z-index: 1004;
  background-color: #fff;
  // border-radius: 5px;
  .menu{
    width: 100px;
    text-align: left;
    // padding: 5px;
    box-shadow: 0 2px 12px 0 rgba(0,0,0,0.1);
    .menu_item{
      height: 24px;
      line-height: 22px;
      // margin-top: 5px;
    }
    .item_text{
      color: #171A1D;
      cursor: pointer;
      padding: 4px 20px;
      // border-radius: 3px;
      transition: all .2s ease-in;
    }
    .item_text:hover {
      background-color: #E9EAEC;
    }
  }
}
  • @contextmenu.prevent.stop 为阻止浏览器的右键点击菜单事件
  • isShowMenu: 来控制菜单的显示

三、页面逻辑

  • 同时我们要为其出现的地方进行调整 menuTop,menuLeft,在展示 menu 的时候我们将 event 的页面位置属性 e.pageX 和 e.pageX 拿来赋值
  • 我们需要在页面创建的时候增加 click 和 mousedonw 的监听,这样就可以在我们点击别的地方的时候将菜单隐藏
// 右键菜单
const isShowMenu = ref(false) // 控制是否显示右键菜单
const menuLeft = ref(0)
const menuTop = ref(0)
const openMenuConfigId = ref(0) // 打开右键菜单的那一行的configId
const isNowTop = ref(false) // 是否已置顶
const showMenu = async(e:any, index:number, configId:number):Promise<void> => {
  // console.log(e, index, configId)
  // eslint-disable-next-line
  const data = await window.app.windowGetData(store.userBaseInfo.username + '.data.warn')
  data.forEach((item:any) => {
    if (item.configId === configId) {
      if (item.isTop) {
        isNowTop.value = true
      } else {
        isNowTop.value = false
      }
    }
  })
  openMenuConfigId.value = configId
  isShowMenu.value = true
  menuLeft.value = e.pageX
  menuTop.value = e.pageY
}
// 置顶
const stick = async(status:boolean):Promise<void> => {
  // eslint-disable-next-line
  let data = await window.app.windowGetData(store.userBaseInfo.username + '.data.warn')
  data.forEach((item:any) => {
    if (item.configId === openMenuConfigId.value) {
      item.isTop = status
    }
  })
  const topList:any[] = []
  data.forEach((item:any) => {
    if (item.isTop) {
      topList.push(item)
    }
  })
  topList.sort((a:any, b:any) => (b.maxCreateTime - a.maxCreateTime))
  data = data.filter((item:any) => (item.isTop === false))
  data.sort((a:any, b:any) => (b.maxCreateTime - a.maxCreateTime))
  data = topList.concat(data)

  warnList = JSON.parse(JSON.stringify(data))
  $forceUpdate()
  // eslint-disable-next-line
  window.app.windowStoreData(store.userBaseInfo.username + '.data.warn', data)
  clockMenu()
}
// 删除
const showDelPop = ref(false)
const deleteList = async():Promise<void> => {
  // eslint-disable-next-line
  let data = await window.app.windowGetData(store.userBaseInfo.username + '.data.warn')
  data = data.filter((item:any) => (item.configId !== openMenuConfigId.value))

  warnList = JSON.parse(JSON.stringify(data))
  $forceUpdate()
  // eslint-disable-next-line
  window.app.windowStoreData(store.userBaseInfo.username + '.data.warn', data)
  clockMenu()
}
// 关闭菜单
const clockMenu = ():void => {
  isShowMenu.value = false
}

// 失去焦点时关闭右击菜单文章来源地址https://www.toymoban.com/news/detail-552213.html

mounted() {
  //失去焦点时关闭右击菜单
  document.addEventListener("click", (e) => {
    if (!this.$refs.rightMenu.contains(e.target))
      this.rightMenuVisible = false;
  });
}

四、希望能帮到你

到了这里,关于vue实现点击右键出现自定义操作菜单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue 在线聊天实战范例(含选择发送表情、图片、视频、音频,自定义右键快捷菜单,一键复制,左右聊天气泡)

    链接:https://pan.baidu.com/s/170pb-MJlMxG2nRj_3Y2VFw?pwd=oknr 提取码:oknr

    2024年02月07日
    浏览(66)
  • vue3使用el-menu多级菜单出现点击一个全部展开的问题

            测试时发现单击菜单显示子菜单时其它的菜单也被展开,看了其它文章写的是修改:index=\\\"menu.index\\\",         虽然点击菜单其它的子菜单不会展开了,但是index存的是编号,url存的是路由地址,点击子菜单地址栏显示的是编号信息,不是地址,如图所示      

    2024年02月02日
    浏览(50)
  • MacBook IDEA 使用蓝牙外接鼠标 点击右键无法呼出菜单(右键点击无反应)

    使用最新版的IDEA(IntelliJ IDEA 2022.1.2 (Ultimate Edition)),并使用蓝牙连接外置鼠标,IDEA右键无法呼出菜单。只能偶尔呼出一次。绝大部分时间无法呼出。此时包括笔记本的鼠标触控板也无法在IDEA中呼出菜单。但是在其他软件都可以正常呼出菜单。只有在IDEA中会出现这个问题。

    2024年02月11日
    浏览(57)
  • 记录--Vue 右键菜单的秘密:自适应位置的实现方法

    下图这个情景,你是否也遇到过? 当你右键点击网页上的某个元素时,弹出的菜单被屏幕边缘遮挡了,导致你无法看清或选择菜单项? 上图中右键菜单的选项并不是固定不变的,它会根据不同的元素或场景来显示不同的选项。 也就是说,菜单的内容和大小都是动态生成的,

    2024年02月08日
    浏览(34)
  • Vue3 如何实现一个函数式右键菜单(ContextMenus)

    前言: 最近在公司 PC 端的项目中使用到了右键出现菜单选项这样的一个工作需求,并且自己现在也在实现一个偶然迸发的 idea ( 想用前端实现一个 windows 系统从开机到桌面的 UI ),其中也要用到右键弹出菜单这样的一个功能,个人觉得这个实现还不错,特来分享🎁。 tips:

    2024年02月06日
    浏览(49)
  • Vue3 + Element Plus 实现动态标签页及右键菜单

    目录 先上图  使用el-dropdown绑定右键菜单,为每个tab页绑定一个右键 右键菜单生效后控制每个下拉项的禁用与显示(每一项代表一个功能) 每个右键项对应的功能  控制每次只显示一个右键 完整代码         只有首页的情况         多个tab页的情况  

    2024年02月07日
    浏览(49)
  • vue+openlayers,初始化openlayers地图,实现鼠标移入、点击、右键等事件

    主要功能:初始化openlayers地图,实现鼠标移入、点击、右键等事件,以及获取当前图标的feature,将当前图标信息以弹框方式进行展示;地图上展示拾取到的经纬度 前端使用的是vue技术栈 步骤一:将地图的公用配置项单独提出成一个js文件,方便打包后进行修改,代码如下

    2024年02月11日
    浏览(41)
  • Windows如何自定义右键新建菜单栏

    右键新建菜单的实现原理 参考文章 修改 win10 右键“新建”菜单(原理、两种方法及注意事项)_goocheez的博客-CSDN博客_右键新建菜单 默认情况下,win10 会在用户 每次单击右键后 ,系统弹出“新建”菜单之前,从注册表 计算机HKEY_CLASSES_ROOT 中的各个后缀中提取 ShellNew 分支,

    2024年02月06日
    浏览(42)
  • electron自定义窗口和右键菜单样式

    electron默认沿用系统UI,并没有提供很多接口供使用者定制样式,如果想要完全自定义的样式,目前我能想到的方案只能是通过前端自定义样式,然后通过进程通信来实现系统基础功能:最大/小化、关闭、拖动窗口等。 通过前面系列文章我们可以了解到,窗口是通过实例化

    2024年02月02日
    浏览(73)
  • vue3如何实现点击不同的菜单页切换局部页面

    我们可以使用router来实现 去饿了么(element-plus)找到自己喜欢的页面然后按需导入,以下以自己的例子来实现 首先引入布局容器 然后引入菜单栏 引入这两个,先看效果 此时基本的页面准备好了 容器是有这个属性的,但默认值为false 并把菜单栏里对应的文字改为router-link 在

    2024年02月16日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包