antdesign vue中table表头列的拖拽和列宽的拖拽

本文介绍了如何在Vue项目中利用antdesignvue和vue-draggable-resizable、Sortable.js库实现表头列宽的拖拽调整以及整列位置的拖拽功能,包括组件化开发和事件处理的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写项目时遇到一个需求就是表头是可以拖动换位置的,并且需要用户手动拖拽设置宽度,我的项目用的是vue+antdesign vue实现的

  1. 实现列宽的拖拽倒是挺简单的,因为antdesign vue中有说明列宽拖拽怎么实现,
    先下载vue-draggable-resizable
    然后引入import VueDraggableResizable from 'vue-draggable-resizable';
     <a-table
            bordered
            :rowKey="rowKey"
            :style="{ '--minHeight': `${pageHeight - 8}px` }"
            :columns="commonColumns"
            :row-selection="rowSelection"
            :loading="loading"
            :key="key"
            :data-source="commonData"
            :pagination="false"
            :customRow="onClickRowMulti"
            :rowClassName="getRowClassName"
            :scroll="{ x: 1000, y: pageHeight - 10 }"
            :components="components">
          </a-table>
    
    
    
    this.components = {
          header: {
            cell: (h, props, children) => {
              const draggingMap = {};
              this.commonColumns.forEach(col => {
                draggingMap[col.key] = col.width;
              });
              const draggingState = Vue.observable(draggingMap);
              let thDom = null;
              const { key, ...restProps } = props;
              const col = this.commonColumns.find(col => {
                const k = col.dataIndex || col.key;
                return k === key;
              });
              if (!col || !col.width) {
                return h(
                  'th',
                  {
                    ...restProps
                  },
                  [children]
                );
              }
              const onDrag = x => {
                draggingState[key] = 0;
                col.width = Math.max(x, 1);
              };
              const onDragstop = () => {
                if (thDom) {
                  draggingState[key] = thDom.getBoundingClientRect().width;
                }
              };
              return h(
                'th',
                {
                  ...restProps,
                  attrs: {
                    width: col.width
                  },
                  'v-ant-ref': r => (thDom = r),
                  class: 'resize-table-th'
                },
                [
                  children,
                  h('vue-draggable-resizable', {
                    class: 'table-draggable-handle',
                    on: {
                      dragging: onDrag,
                      dragstop: onDragstop
                    },
                    key: col.key,
                    props: {
                      w: 10,
                      x: draggingState[key] || col.width,
                      z: 1000,
                      axis: 'x',
                      resizable: false
                    }
                  })
                ]
              );
            }
          }
        };

    就是这么的简单

  2. 实现一整列的位置拖拽就得依靠插件来实现了
    先下载sortablejs
    引入import Sortable from 'sortablejs';

    /** 列拖拽 */
        columnDrop() {
          const that = this;
          const wrapperTr = document.querySelector('.ant-table-thead tr');
          Sortable.create(wrapperTr, {
            animation: 180,
            delay: 0,
            handle: '.ant-table-header-column', //~~可进行拖拽对应的类名~~~~~~
            onUpdate: evt => {
              var o = evt.oldIndex;
              var n = evt.newIndex;
              that.sortListAndUpdate(that.commonColumns, o, n);
              /**此处是因为在拖拽后,内容排序正常,表头错乱的问题 ---强制进行了重新渲染**/
              this.key += 1;
              this.$nextTick(() => {
                this.columnDrop();
              });
            }
          });
        },
        // 对表头进行排序,要求 o(oldIndex) 和 n(newIndex) 从 0开始
        sortList(list, o, n) {
          var newColums = JSON.parse(JSON.stringify(list));
          var data = newColums.splice(o - 1, 1, null);
          newColums.splice(o - 1 < n - 1 ? n : n - 1, 0, data[0]);
          newColums.splice(o - 1 > n - 1 ? o : o - 1, 1);
          return newColums;
        },
        /**
         * 对数据排序并更新 table, 要求 o(oldIndex) 和 n(newIndex) 从 0开始
         */
        sortListAndUpdate(list, o, n) {
          var newTableData = this.sortList(list, o, n);
          this.commonColumns = newTableData;
        }
    
    
    mounted() {
        this.$nextTick(() => {
          this.columnDrop();
        });
      },

    这样就可以实现整列的位置拖拽了,你要是想这两个需求同时实现的话,就把他下载一起就可以了,

  3. 完事,搞定。。。。。。

### 实现 Ant Design Vue 表格组件的手动调整 为了在 Ant Design Vue 的表格组件中实现手动调整的功能,可以利用 `Resizable` 属性以及自定义事件处理程序来完成这一功能。具体来说: #### 使用 Resizable 属性 Ant Design Vue 提供了内置的支持用于创建可调整度的。通过设置表头配置中的 `resizable` 属性为 true 可以启用此特性。 ```javascript const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', resizable: true, // 启用调整 }, { title: 'Age', dataIndex: 'age', key: 'age', resizable: true, } ]; ``` #### 处理变化事件 当用户拖拽改变某一度时,会触发相应的事件。可以通过监听这些事件并更新状态来保存新的设定。 ```vue <template> <a-table :columns="columns" :data-source="dataSource"> <!-- 其他配置 --> </a-table> </template> <script setup lang="ts"> import { ref } from 'vue'; let columns = ref([ { title: 'Name', dataIndex: 'name', key: 'name', width: 200, // 设置初始度 onHeaderCell: (column) => ({ style: { cursor: 'col-resize' }, onresize() { console.log('Column resized'); } }), resizable: true }, /* ... */ ]); // 假设的数据源 const dataSource = [...]; function handleResize(event, column){ const newWidth = event.target.offsetWidth; Object.assign(column, {width:newWidth}); } </script> ``` 上述代码展示了如何使用 `onHeaderCell` 来附加样式行为到特定单元格上,在这里主要是用来响应用户的鼠标操作以便于识别何时发生了尺寸更改,并据此调用回调函数 `handleResize()` 更新对应的实际度[^1]。 需要注意的是,实际项目开发过程中可能还需要考虑更多细节问题,比如持久化存储用户的偏好设置、跨浏览器兼容性测试等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值