组件代码:

<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. iOS 使用xcode11新建项目

    1. 首先打开Xcode11,然后使用command + shift + n 快捷键创建一个新的工程 选择 Single View App   完成之后点击next 2. 会弹出 Choose opt ...

  2. Gvim基础操作-01

    Gvim基础操作 进行代码或者是文本.脚本都要使用到文本编辑工具. vi是visual的缩写,其意为可视化.它是Unix系统文本编辑的标准工具.利用光标在屏幕上的移动,用户可以方便的建立.修改或者插入 ...

  3. 图文并茂基于阿里云linux服务器部署nodejs项目并添加pm2守护nodejs项目运行进程(Linux version 4.19.81-17.1.al7.x86_64)

    首先你要有一台LINIX服务器,登入以后按下面步骤执行命令,可查看系统版本以及配置 查看Linux 内核 通过 uname -a 命令查看系统位数是64位 x86_64表示64位系统, i686 i3 ...

  4. js节流防抖 减少服务器请求

  5. JavaScript 检查(Linting)工具的比较

    一个好的检查(linting)工具可以确保一个项目遵循编码规范. 让我们来看看四种流行替代方案的特性和优缺点:JSLint , JSHint , JSCS 和 ESLint . JSLint JSLi ...

  6. Odoo View 常用技巧

    隐藏Field <field name="currency_id" invisible="True"/> <field name=" ...

  7. 2023牛客寒假算法基础集训营4 A-H+JLM

    比赛链接 A 题解 知识点:数学. 算一下发现 \(3\) 最好,\(2,4\) 并列, \(4\) 以后递减.于是,特判 \(3\) ,其他取最小值. (众所周知, \(e\) 进制最好qwq. 时 ...

  8. Linux几种网络模式介绍

    简单介绍Linux几种网络模式 ​ 虚拟化层次: ​ 打开vmware虚拟机,我们可以在选项栏的"编辑"下的"虚拟网络编辑器"中看到VMnet0(桥接模式).V ...

  9. 《Terraform 101 从入门到实践》 第四章 States状态管理

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 军书十二卷,卷卷有爷名. 为 ...

  10. JAVA虚拟机17---栈帧(局部变量表-操作数栈-动态连接-返回地址)

    借鉴:转https://blog.csdn.net/u011069294/article/details/107106755,他的虚拟机专栏:https://blog.csdn.net/u011069 ...