Ant Design Vue中Table組件行內右鍵菜單實現方法

最近作的一個項目是基於 vue + AntDesign 的。因爲項目要求,須要在 Table 組件的行內點右鍵的時候彈出菜單。在線演示地址及最終效果圖以下:
在線演示地址>>vue

20191121091613.png

首先新建一個Table組件的實例:antd

<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菜單組件的實例及其樣式:this

<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"來定義。spa

下面就是最重要的,經過Table組件的customRow參數來設置鼠標右鍵事件。首先添加Table組件的customRow參數:code

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

而後在data裏添加customClick的右鍵方法,以及在methods裏添加body的click方法。添加body的click方法是爲了在出現右鍵菜單後,點擊左鍵時關閉菜單。blog

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>
相關文章
相關標籤/搜索