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 相关文章推荐
js中indexof的用法详细解析
Dec 24 Javascript
jquery单行文字向上滚动效果示例
Mar 06 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
Jquery基础之事件操作详解
Jun 14 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
详解React中的组件通信问题
Jul 31 Javascript
vue移动端项目缓存问题实践记录
Oct 29 Javascript
利用jsonp解决js读取本地json跨域的问题
Dec 11 Javascript
react实现移动端下拉菜单的示例代码
Jan 16 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 17 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
改造一台复古桌面收音机
2021/03/02 无线电
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
vue如何截取字符串
2019/05/06 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
python学习 流程控制语句详解
2016/06/01 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python使用turtle绘制分形树
2018/06/22 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Linux的主要特性
2016/09/03 面试题
中餐厅主管的职责范文
2014/02/04 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
超市食品安全承诺书
2015/04/29 职场文书
庆元旦主持词
2015/07/06 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏