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 相关文章推荐
分享10篇优秀的jQuery幻灯片制作教程及应用案例
Apr 16 Javascript
jQuery ajax 路由和过滤器使用说明
Aug 02 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
js 获取范围内的随机数实例代码
Aug 02 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
vue todo-list组件发布到npm上的方法
Apr 04 Javascript
JavaScript 继承 封装 多态实现及原理详解
Jul 29 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
Typescript类型系统FLOW静态检查基本规范
May 25 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
一棵php的类树(支持无限分类)
2006/10/09 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
IE8 原生JSON支持
2009/04/13 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
script标签属性用type还是language
2015/01/21 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
详解easyui 切换主题皮肤
2019/04/04 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
Python中str.format()详解
2017/03/12 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
详解Python3注释知识点
2019/02/19 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
什么是GWT的Module
2013/01/20 面试题
酒店副总经理岗位职责范本
2014/02/04 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
体育馆的标语
2014/06/24 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
投标邀请书范本
2015/02/02 职场文书
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
基于Python实现对比Exce的工具
2022/04/07 Python