组件代码:

<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. 模仿 vscode-server 把本地代码目录映射到外网

    目录 概述 分析 解决方案 准备一台VM 创建容器 SmartIDE 创建 直接使用 docker 创建 SSH 远程转发 内网穿透 ngrok frp 服务端 客户端 本文模仿 vscode-ser ...

  2. Spring MVC的运行流程

    Spring MVC的运行流程 摘要:本文档主要结合官方给出的Spring MVC流程图结合一个简单的Spring MVC实例,分析并介绍了Spring MVC的运行流程. 目录 Spring MVC ...

  3. 使用“宝塔一键迁移”工具,将typecho博客迁移到京东云cvm云主机

    作者:京东科技 林中 服务器更换.网站搬家,对于很多开发者新手来说不是一件容易的事情,需要迁移网站程序.数据库,修改数据库连接文件等.在云迁移方案中,宝塔是非常简单好用的服务器运维面板,能够极大提升运 ...

  4. Longhorn+K8S+KubeSphere云端数据管理,实战 Sentry PostgreSQL 数据卷增量快照/备份与还原

    云端实验环境配置 VKE K8S Cluster Vultr 托管集群 https://vultr.com/ 3 个 worker 节点,kubectl get nodes. k8s-paas-71a ...

  5. JS实现excel数据透析,形成关系图

    网上查了好多例子,都没有找到答案,只能自己硬着头皮写了 想要的样子: 下面是DEMO,已经实现效果了!!!! 举例  导入 <!DOCTYPE html> <html lang=&q ...

  6. 关于VBA中,activesheet用法的一些思考

    前二天,给财务部做了个数据采集的工具,因为财务现在用的是excel2013 和2017的版本,所以我决定不用python,改用VBA来处理这个工具. 在 写过程的时候,我用了sheets(i)来定位表 ...

  7. Kubernetes(k8s)密码管理:Secret

    目录 一.系统环境 二.前言 三.Secret概览 四.Secret 的类型 五.各种类型的secret使用实例 5.1 创建kubernetes.io/service-account-token类型 ...

  8. Java 进阶P-4.8+P-4.9

    Object类 Object类的函数 toString() equals() Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object ...

  9. Java 进阶P-4.6+P-4.7

    向上造型 造型cast 子类的对象可以赋值给父类的变量 注意! java中不存在对象对对象的赋值!! 父类的对象不能赋值给子类的变量 可以用造型: c=(Car) v; (只有当v这个变量实际管理的是 ...

  10. P28_全局配置 - 常用的全局配置项以及小程序窗口的组成部分

    全局配置文件及常用的配置项 pages 记录当前小程序所有页面的存放路径 window 全局设置小程序窗口的外观 tabBar 设置小程序底部的 tabBar 效果 style 是否启用新版的组件样式 ...