Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)


Posted in Javascript onNovember 21, 2019

最近做的一个项目是基于 vue + AntDesign 的。由于项目要求,需要在 Table 组件的行内点右键的时候弹出菜单。在线演示地址及最终效果图如下:

在线演示地址>>

Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign) 

首先新建一个Table组件的实例:

<a-table
 :columns="columns"
 :rowKey="record => { return record.INDEX;}"
 :dataSource="tableData"
/>
...
 const columns = [
 {
  title: "序号",
  dataIndex: "INDEX"
 },
 {
  title: "主题大类",
  dataIndex: "THEME"
 },
 {
  title: "中文名称",
  dataIndex: "CN_NAME"
 },
 {
  title: "英文名称",
  dataIndex: "EN_NAME"
 }
];
...
 data() {
  return {
   columns,
   tableData: [
    { INDEX: 0, THEME: "基础数据", CN_NAME: "地区", EN_NAME: "Area" },
    { INDEX: 1, THEME: "个人信息", CN_NAME: "姓名", EN_NAME: "Name" }
   ]
  };
 }

新建一个Menu菜单组件的实例及其样式:

<a-menu :style="menuStyle" v-if="menuVisible">
   <a-menu-item>{{menuData.THEME}}</a-menu-item>
   <a-menu-item>{{menuData.CN_NAME}}</a-menu-item>
   <a-menu-item>{{menuData.EN_NAME}}</a-menu-item>
  </a-menu>
...
 data() {
  return {
   ...
   menuData: {},
   menuVisible: false,
   menuStyle: {
    position: "absolute",
    top: "0",
    left: "0",
    border: "1px solid #eee"
   }
  };
 }

注意这里给Menu加样式主要是为了实现点右键时Menu菜单出现在鼠标位置,所以我用了position: "absolute"来定义。

下面就是最重要的,通过Table组件的customRow参数来设置鼠标右键事件。首先添加Table组件的customRow参数:

<a-table
   ...
   :customRow="customClick"
  />

然后在data里添加customClick的右键方法,以及在methods里添加body的click方法。添加body的click方法是为了在出现右键菜单后,点击左键时关闭菜单。

data() {
  return {
   ...
   customClick: record => ({
    on: {
     contextmenu: e => {
      e.preventDefault();
      this.menuData = record;
      this.menuVisible = true;
      this.menuStyle.top = e.clientY + "px";
      this.menuStyle.left = e.clientX + "px";
      document.body.addEventListener("click", this.bodyClick);
     }
    }
   })
  };
 },
 methods: {
  bodyClick() {
   this.menuVisible = false;
   document.body.removeEventListener("click", this.bodyClick);
  }
 }

至此,Ant Design Vue中Table组件行内右键菜单就实现了。完整代码如下:

<template>
 <div>
  <a-table
   :columns="columns"
   :rowKey="record => { return record.INDEX;}"
   :dataSource="tableData"
   :customRow="customClick"
  />
  <a-menu :style="menuStyle" v-if="menuVisible">
   <a-menu-item>{{menuData.THEME}}</a-menu-item>
   <a-menu-item>{{menuData.CN_NAME}}</a-menu-item>
   <a-menu-item>{{menuData.EN_NAME}}</a-menu-item>
  </a-menu>
 </div>
</template>
<script>
const columns = [
 {
  title: "序号",
  dataIndex: "INDEX"
 },
 {
  title: "主题大类",
  dataIndex: "THEME"
 },
 {
  title: "中文名称",
  dataIndex: "CN_NAME"
 },
 {
  title: "英文名称",
  dataIndex: "EN_NAME"
 }
];
export default {
 data() {
  return {
   columns,
   tableData: [
    { INDEX: 0, THEME: "基础数据", CN_NAME: "地区", EN_NAME: "Area" },
    { INDEX: 1, THEME: "个人信息", CN_NAME: "姓名", EN_NAME: "Name" }
   ],
   menuData: {},
   menuVisible: false,
   menuStyle: {
    position: "absolute",
    top: "0",
    left: "0",
    border: "1px solid #eee"
   },
   customClick: record => ({
    on: {
     contextmenu: e => {
      e.preventDefault();
      this.menuData = record;
      this.menuVisible = true;
      this.menuStyle.top = e.clientY + "px";
      this.menuStyle.left = e.clientX + "px";
      document.body.addEventListener("click", this.bodyClick);
     }
    }
   })
  };
 },
 methods: {
  bodyClick() {
   this.menuVisible = false;
   document.body.removeEventListener("click", this.bodyClick);
  }
 }
};
</script>

总结

以上所述是小编给大家介绍的Vue中Table组件行内右键菜单实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
var与Javascript变量隐式声明
Sep 17 Javascript
JavaScript 基础篇(一)
Mar 30 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
Oct 23 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
js学习笔记之事件处理模型
Oct 31 Javascript
JavaScript登录记住密码操作(超简单代码)
Mar 22 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
Dec 26 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 Javascript
解决iview多表头动态更改列元素发生的错误的方法
Nov 02 Javascript
关于小程序优化的一些建议(小结)
Dec 10 Javascript
vue element 中的table动态渲染实现(动态表头)
Nov 21 #Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 21 #Javascript
webpack常用构建优化策略小结
Nov 21 #Javascript
Vue 中 filter 与 computed 的区别与用法解析
Nov 21 #Javascript
js实现课堂随机点名系统
Nov 21 #Javascript
JavaScript实现简单随机点名器
Nov 21 #Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 #Javascript
You might like
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
js实现计算器功能
2020/08/10 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python模块常用用法实例详解
2019/10/17 Python
python编写俄罗斯方块
2020/03/13 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
实习生自我鉴定
2013/12/12 职场文书
英语专业学生的自我评价
2013/12/30 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL
hive数据仓库新增字段方法
2022/06/25 数据库