vue+elementUI表格实现自定义右键菜单
组件代码:
<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表格实现自定义右键菜单的更多相关文章
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- JavaScript自定义右键菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]
许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...
- JS简单实现自定义右键菜单
RT,一个简单的例子,仅仅讲述原理 <div id="menu" style="width: 0;height: 0;background: cadetblue;p ...
- antd Tree组件中,自定义右键菜单
最近项目中,有一个需求是自定义antd的Tree组件的右键菜单功能. 直接上代码 class Demo extends Component { state = { rightClickNodeTree ...
- AS3.0 自定义右键菜单类
AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...
- js之自定义右键菜单
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [ActionScript 3.0] 自定义右键菜单
将自定义右键菜单的一些属性和方法归纳到AddRightMenu.as,通过实例化此类,调用相关方法即可测试! package { import flash.display.Sprite; import ...
- 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单
连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...
- 阻止右键菜单(阻止默认事件)&&跟随鼠标移动(大图展示)&&自定义右键菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- 【转载】EXCEL VBA 自动筛选—AutoFilter方法
AutoFilter方法的语法及说明 下面是Range对象的AutoFilter方法的语法: Range对象.AutoFilter(Field,Criterial1,Operator,C ...
- linux基础:1、linux简介、虚拟化软件的安装与配置、Xshell的安装与配置
Linux 目录 Linux 一.linux简介 二.linux发展史 三.虚拟化技术 1.简介 2.虚拟化软件下载 3.重要名词解释 4.远程链接工具 一.linux简介 常见岗位 1.自动化运维 ...
- 【项目实战】从零到一搭建Spring Boot整合Mybatis-plus
前言 2023年想搭建一套属于自己的框架,做一个属于自己想法的项目.这些年工作中一直用公司已有的框架,以前有跟着学习视频搭建过,但自己真正动手搭建时发现问题还是很多,比如没有引入Mybatis-plu ...
- 在Typescript项目中,使用ESLint和Prettier,以及解决保存代码后ESLint配置冲突问题
首先,检查项目中根目录.eslintrc.js文件,该文件中定义了ESLint的基础配置,找到其中的rules 例如: const prettierConfig = require('./.prett ...
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(5)-Charles如何设置捕获Https会话
1.简介 在大数据时代,互联网时代,个人信息安全尤为重要,网络安全在近日多起电信诈骗事情发酵下的情况下,引起国家,企业,个人对于互联网安全进一步的重视.而之前很多以http协议传输的网站出现的网站信息 ...
- List_集合_介绍&常用方法-ArrayList集合
List_集合_介绍&常用方法 我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢?接下来,我们一起学习Collection中的常用几个 ...
- Docker命令的自动补齐
Docker命令的自动补齐 背景 在linux下输入命令或文件都是可以自动补齐的,这个特性极大的提高了我们的效率,多数情况下我们很少用命令参数的自动补齐. 但对docker git这类参数特别多的命令 ...
- countdownlatch应用场景
场景1 让多个线程等待:模拟并发,让并发线程一起执行 为了模拟高并发,让一组线程在指定时刻(秒杀时间)执行抢购,这些线程在准备就绪后,进行等待(CountDownLatch.await()),直到秒杀 ...
- Gitee + Sourcetree 配置公钥 SSH
设置前提 安装Git Git下载 安装sourceTree sourceTree下载 gitee账号 gitee官网 Git设置公钥 1.在安装好 sourcetree 后 点击操作选择在终端中打开 ...
- 一篇文章带你弄懂Kerberos的设计思路
这篇文章将会带大家详细梳理和理解Kerberos的设计思路. Basic 为了减轻服务器的负担,我们需要设计一个专门的认证服务器AS,储存所有用户的口令,认证了用户身份之后再通知应用服务器 引入tic ...