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 相关文章推荐
javascript中巧用“闭包”实现程序的暂停执行功能
Apr 04 Javascript
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
Dec 31 Javascript
JQuery中Bind()事件用法分析
May 05 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
JS实现移动端判断上拉和下滑功能
Aug 07 Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
node.js中npm包管理工具用法分析
Feb 14 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
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Python中random模块生成随机数详解
2016/03/10 Python
Python 中的with关键字使用详解
2016/09/11 Python
Sanic框架路由用法实例分析
2018/07/16 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python实现三壶谜题的示例详解
2020/11/02 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
UNIX命令速查表
2012/03/10 面试题
医生实习工作总结的自我评价
2013/09/27 职场文书
党建工作经验交流材料
2014/05/25 职场文书
银行求职信
2014/05/31 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
医院员工辞职信范文
2015/05/12 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
详解Python描述符的工作原理
2021/06/11 Python