组件代码:

<template>
<div id="contextmenu" class="contextmenu open">
<ul class="dropdown-menu" style="min-width: 130px;">
<template v-for="item in menuItems">
<li
v-if="typeof item.children !== 'undefined' && item.children.length > 0"
:key="item.btnId + 'predivider'"
class="divider no-margin"
/>
<li
:key="item.btnId"
:class="typeof item.children !== 'undefined' && item.children.length > 0 ? 'dropdown-hover' : ''"
>
<a
v-if="typeof item.children !== 'undefined' && item.children.length > 0"
tabindex="-1"
class="clearfix"
>
<span class="pull-left" @click.self="handleClick(item)">{{ item.name }}</span>
<i class="dropdown-expand fa fa-angle-right" />
</a>
<a
v-else
tabindex="-1"
@click.self="handleClick(item)"
>
{{ item.name }}
</a>
<ul
v-if="typeof item.children !== 'undefined' && item.children.length > 0"
class="dropdown-menu"
style="min-width: 130px;"
>
<template v-for="childItem in item.children">
<li
:key="childItem.btnId"
>
<a tabindex="-1" @click.self="handleClick(childItem)">{{ childItem.name }}</a>
</li>
</template>
</ul>
</li>
<li
v-if="typeof item.children !== 'undefined' && item.children.length > 0"
:key="item.btnId + 'afterdivider'"
class="divider no-margin"
/>
</template>
</ul>
</div>
</template>
<script>
export default {
name: 'ContextButton',
props: {
menuItems: {
type: Array,
default: () => []
}
},
data() {
return {
currentRow: {}
}
},
methods: {
hiddenMenu() {
this.$emit('hidden-menu')
},
handleClick(item) {
this.$emit('click', item, this.currentRow)
},
init(row, event) {
this.currentRow = row
const menu = document.querySelector('#contextmenu')
const mouseX = event.clientX
const mouseY = event.clientY
const boundsX = window.innerWidth
const boundsY = window.innerHeight
const menuHeight = menu.scrollHeight
const menuWidth = menu.scrollWidth
let top
let left
const scrollTop = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop
if (mouseY + menuHeight > boundsY) {
const topH = mouseY - menuHeight + scrollTop
const menuTop = mouseY - menuHeight
if (topH > 0 && menuTop > 0) {
top = topH
} else {
top = mouseY + scrollTop
}
} else {
top = mouseY + scrollTop
}
const scrollLeft = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft
if ((mouseX + menuWidth > boundsX) && ((mouseX - menuWidth) > 0)) {
left = mouseX - menuWidth + scrollLeft
} else {
left = mouseX + scrollLeft
}
const parentOffsetTop = event.currentTarget.parentElement.offsetTop
const parentOffsetLeft = event.currentTarget.parentElement.offsetLeft
menu.style.top = top - parentOffsetTop + 'px'
menu.style.left = left - parentOffsetLeft + 'px'
document.addEventListener('click', this.hiddenMenu)
}
}
}
</script>
<style scoped>
.contextmenu {
position: absolute;
z-index: 1000;
}
</style>

组件使用代码:

<el-table
...
@row-contextmenu="handleContextMenu"
>
</el-table>
<ContextButton
v-if="menuVisible"
ref="menuContextButton"
:menu-items="menuItems"
@hidden-menu="hiddenMenu"
@click="menuBtnClick"
/>
<script>
export default{
data() {
return {
menuVisible: false,
menuItems: [
{
name: '编辑',
btnId: 'edit'
},
{
name: '删除',
btnId: 'delete'
},
]
}
},
methods: {
handleContextMenu() {
// 右键方法
this.menuVisible = false
this.menuVisible = true
event.preventDefault()
this.$nextTick(() => {
(this.$refs.menuContextButton as any).init(row, event)
})
},
menuBtnClick() {
// 点击菜单项方法
if (item.btnId === 'edit') {
this.editFn(row)
} else if (item.btnId === 'delete') {
this.deleteFn(row.id)
}
}
hiddenMenu() {
// 隐藏菜单方法
this.menuVisible = false
document.removeEventListener('click', this.hiddenMenu)
}
editFn(row) {
// 编辑方法
}
deleteFn(id) {
// 删除方法
}
}
}
</script>

参考:vue + elementUI 表格右键弹出菜单 - 简书 (jianshu.com)

vue+elementUI表格实现自定义右键菜单的更多相关文章

  1. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  2. JavaScript自定义右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...

  4. JS简单实现自定义右键菜单

    RT,一个简单的例子,仅仅讲述原理 <div id="menu" style="width: 0;height: 0;background: cadetblue;p ...

  5. antd Tree组件中,自定义右键菜单

    最近项目中,有一个需求是自定义antd的Tree组件的右键菜单功能. 直接上代码 class Demo extends Component { state = { rightClickNodeTree ...

  6. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  7. js之自定义右键菜单

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [ActionScript 3.0] 自定义右键菜单

    将自定义右键菜单的一些属性和方法归纳到AddRightMenu.as,通过实例化此类,调用相关方法即可测试! package { import flash.display.Sprite; import ...

  9. 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

    连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...

  10. 阻止右键菜单(阻止默认事件)&&跟随鼠标移动(大图展示)&&自定义右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. 一次SQL调优 聊一聊 SQLSERVER 数据页

    一:背景 1.讲故事 最近给一位朋友做 SQL 慢语句 优化,花了些时间调优,遗憾的是 SQLSERVER 非源码公开,玩起来不是那么顺利,不过从这次经历中我觉得明年的一个重大任务就是好好研究一下它, ...

  2. [OpenCV实战]44 使用OpenCV进行图像超分放大

    图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像.图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析.生物识别.视频监 ...

  3. tempdb数据文件暴增分析

    背景 某客户tempdb数据文件突然暴增,导致磁盘可用空间紧张,让我们找到暴增的原因. 现象 登录到SQL专家云,通过趋势分析进行回溯,在4月12日,tempdb数据文件在3个小时内从10GB涨到了8 ...

  4. Hugging News #0106

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. BUG日记之-----Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway.

    在使用swagger进行测试的时候调用弹窗  解决办法: 在启动类添加@EnableSwagger2注解

  6. 大数据实时多维OLAP分析数据库Apache Druid入门分享-上

    @ 目录 概述 定义 MPP和Lambda补充说明 概述 特征 适用场景 不适用场景 横向对比 部署 单机部署 入门示例 概述 定义 Apache Druid 官网地址 https://druid.a ...

  7. Spring中常见的注解

    1.组件注解 @Controller @Service @Repository @Component ---标注一个类为Spring容器的Bean @Configration ---声明当前类为配置类 ...

  8. Selenium中对于颜色的处理及拓展

    Selenium中对于颜色的处理及拓展 获取百度一下按钮的背景色 from selenium import webdriver from time import sleep driver = webd ...

  9. JAVA虚拟机23---JAVA与线程

    1 线程简介 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度 目前线程是Java里面进行处 ...

  10. .net core Autofac IOC 容器的简单使用

    书接上回,介绍了.net core 读取配置文件的几种方式,本文学习Autofac的同时再次增加一种读取配置文件的方法. 本文介绍Auofac,一个优秀的.NET IOC框架 源码地址:https:/ ...