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

 更新时间:2023年08月04日 10:26:30   作者:老电影故事  
这篇文章主要给大家介绍了关于vue点击右键出现自定义操作菜单实现的相关资料,在网页中我们也希望可以像桌面软件一样,点击右键后出现操作菜单,对选中的数据项进行相应的操作,需要的朋友可以参考下

一、前言

实现像微信一样的点击右键后出现操作菜单,对选中的数据项进行相应的操作,接下来介绍使用原生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
}

// 失去焦点时关闭右击菜单

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

四、总结

到此这篇关于vue点击右键出现自定义操作菜单实现的文章就介绍到这了,更多相关vue点击右键自定义操作菜单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue打包后修改配置后端IP地址、端口等信息两种方法

    vue打包后修改配置后端IP地址、端口等信息两种方法

    这篇文章主要给大家介绍了关于vue打包后修改配置后端IP地址、端口等信息的两种方法,文中通过代码示例以及图文介绍的非常详细,对大家学习或者使用vue打包具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单

    vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单

    这篇文章主要介绍了vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-09-09
  • vue3中覆盖组件样式的方法小结

    vue3中覆盖组件样式的方法小结

    在 Vue 3 中,覆盖组件样式的方法与 Vue 2 相似,但由于 Vue 3 更多地依赖于 CSS 的模块化,一些最佳实践可能会有所不同,下面就跟随小编一起来了解一下吧
    2024-04-04
  • Vue中$router与 $route的区别详解

    Vue中$router与 $route的区别详解

    这篇文章主要介绍了Vue中$router与 $route的区别详解,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • 基于Vue单文件组件详解

    基于Vue单文件组件详解

    下面小编就为大家带来一篇基于Vue单文件组件详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Vue计算属性computed与方法methods的区别及说明

    Vue计算属性computed与方法methods的区别及说明

    这篇文章主要介绍了Vue计算属性computed与方法methods的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 详解从vue-loader源码分析CSS Scoped的实现

    详解从vue-loader源码分析CSS Scoped的实现

    这篇文章主要介绍了详解从vue-loader源码分析CSS Scoped的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • vant时间控件使用方法详解

    vant时间控件使用方法详解

    这篇文章主要为大家详细介绍了vant时间控件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 在vue中实现禁止回退上一步,路由不存历史记录

    在vue中实现禁止回退上一步,路由不存历史记录

    这篇文章主要介绍了在vue中实现禁止回退上一步,路由不存历史记录,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue3不同环境下实现配置代理

    vue3不同环境下实现配置代理

    这篇文章主要介绍了vue3不同环境下实现配置代理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论