当前位置: 首页 > 工具软件 > Table-dragger > 使用案例 >

anti-design-vue table 使用vue-draggable-resizable

田兴旺
2023-12-01

参考vue ant design的官方文档使用以下代码,代码中做了些许修改。

1.这一部分代码注意:要加上:components="components"

<template>
  <a-table bordered :columns="columns" :components="components" :data-source="data">
    <template v-slot:action>
      <a href="javascript:;">Delete</a>
    </template>
  </a-table>
</template>
  1. 由于官方文档中的源代码里,可拖拽的图标不在拖拽的单元格的边框上,这会导致用户在拖拽时,会找不到拖拽的 图标,影响用户体验。

  1. 新增加的代码、修改的代码已在代码中标注好了。

<script>
import Vue from 'vue';
import VueDraggableResizable from 'vue-draggable-resizable';

Vue.component('vue-draggable-resizable', VueDraggableResizable);
const columns = [
  {
    title: 'Date',
    dataIndex: 'date',
    width: 200,
  },
  {
    title: 'Amount',
    dataIndex: 'amount',
    width: 100,
  },
  {
    title: 'Type',
    dataIndex: 'type',
    width: 100,
  },
  {
    title: 'Note',
    dataIndex: 'note',
    width: 100,
  },
  {
    title: 'Action',
    key: 'action',
    scopedSlots: { customRender: 'action' },
  },
];
const data = [
  {
    key: 0,
    date: '2018-02-11',
    amount: 120,
    type: 'income',
    note: 'transfer',
  },
  {
    key: 1,
    date: '2018-03-11',
    amount: 243,
    type: 'income',
    note: 'transfer',
  },
  {
    key: 2,
    date: '2018-04-11',
    amount: 98,
    type: 'income',
    note: 'transfer',
  },
];
const draggingMap = {};
columns.forEach(col => {
  draggingMap[col.key] = col.width;
  col.right = col.width+'px'  // 新加入代码
});
const draggingState = Vue.observable(draggingMap);
const resizeableTitle = (h, props, children) => {  // 把 ResizeableTitle 改为 resizeableTitle,因为有时会因此而报错,安全为上,开头的大写R修改为小写r
  let thDom = null;
  const { key, ...restProps } = props;
  const col = columns.find(col => {
    const k = col.dataIndex || col.key;
    return k === key;
  });
  if (!col.width) {
    return <th {...restProps}>{children}</th>;
  }
  const onDrag = x => {
    draggingState[key] = 0;
    col.width = Math.max(x, 1);
    col.right = col.width+'px'  // 新加入代码
  };

  const onDragstop = () => {
    draggingState[key] = thDom.getBoundingClientRect().width;
  };
  return (
    <th {...restProps} v-ant-ref={r => (thDom = r)} width={col.width} class="resize-table-th">
      {children}
      <vue-draggable-resizable
        key={col.key}
        class="table-draggable-handle"
        style={{right: col.right, transform: 'translate('+col.right+', 0px)'}}  // 新加入代码
        w={10}
        x={draggingState[key] || col.width}
        z={1}
        axis="x"
        draggable={true}
        resizable={false}
        onDragging={onDrag}
        onDragstop={onDragstop}
      ></vue-draggable-resizable>
    </th>
  );
};
export default {
  name: 'App',
  data() {
    this.components = {
      header: {
        cell: resizeableTitle,  // 把 ResizeableTitle 改为 resizeableTitle
      },
    };
    return {
      data,
      columns,
    };
  },
};
</script>

3.把table-draggable-handle 里

<style lang="less">
.resize-table-th {
  position: relative;
  .table-draggable-handle {
    height: 100% !important;
    bottom: 0;
    left: auto !important;
    cursor: col-resize;
    touch-action: none;
    position: absolute;
  }
}
</style>
 类似资料: