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读写(删除)Cookie实例详解
Apr 17 Javascript
babel基本使用详解
Feb 17 Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
Sep 27 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
Nov 05 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
微信小程序 确认框的实现(附代码)
Jul 23 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 Javascript
如何基于JS截获动态代码
Dec 25 Javascript
解决vuecli3中img src 的引入问题
Aug 04 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
小程序转发探索示例
2019/02/19 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
详解【python】str与json类型转换
2019/04/29 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
python中count函数知识点浅析
2020/12/17 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
介绍一下.net和Java的特点和区别
2012/09/26 面试题
培训楼经理岗位责任制
2014/02/10 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
趵突泉导游词
2015/02/03 职场文书
关于军训的感想
2015/08/07 职场文书
小学总务工作总结
2015/08/13 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
golang 在windows中设置环境变量的操作
2021/04/29 Golang
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS