Vue+ant表格可拖动列宽

前言

之前一直用的elementui组件库,el-table是可以拖动列宽的。但是最近新接触的ant组件库不行,必须要自己做些修改了,官网上面也给出了解决方案: vue-draggable-resizable

一、安装vue-draggable-resizable插件

yarn add vue-draggable-resizable

二、全局引入组件或局部引入

在项目的main.js中全局引入

// 挂载全局使用的方法
import VueDraggableResizable from 'vue-draggable-resizable'
import 'vue-draggable-resizable/dist/VueDraggableResizable.css'
Vue.component('vue-draggable-resizable', VueDraggableResizable)

或者在页面中局部引入选其一

import VueDraggableResizable from 'vue-draggable-resizable'
import 'vue-draggable-resizable/dist/VueDraggableResizable.css'

三、在a-table中添加components属性

注意:一定要有bordered属性,columns必须有宽度width
在这里插入图片描述

四、定义components

 handleDrag(column){
    return {
       header: {
       cell: (h, props, children) => {
       const { key, ...restProps } = props
       const col = column.find((col) => {
         const k = col.dataIndex || col.key
         return k === key
       })

       if (!col || !col.width) {
         return h('th', { ...restProps }, [...children])
       }

       const dragProps = {
         key: col.dataIndex || col.key,
         class: 'table-draggable-handle',
         attrs: {
           w: 10,
           x: col.width,
           z: 1,
           axis: 'x',
           draggable: true,
           resizable: false,
         },
         on: {
           dragging: (x, y) => {
             col.width = Math.max(x, 1)
           },
         },
       }
       const drag = h(VueDraggableResizable, { ...dragProps })  //此为局部注册
       //全局引入使用'vue-draggable-resizable'替换VueDraggableResizable
       return h('th', { ...restProps, class: 'resize-table-th' }, [...children, drag])
     },
   }
 }
 }

完整代码

注意:style不要加scoped作用域

<template>
  <a-card :bordered="false">
 
    <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :components="handleDrag(columns)"
      >
    </a-table>
 
  </a-card>
</template>
 
<script>
import Vue from 'vue'
import VueDraggableResizable from 'vue-draggable-resizable'
 
export default {
  components: {
    VueDraggableResizable
  },
  data() {
    return {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 12 },
      },
      form: null,
        //表头
      columns: [
        {
          title: '项目名称',
          dataIndex: 'projectName',
          ellipsis: true,
          width:200,
        },
        {
          title: '企业名称',
          dataIndex: 'company',
          ellipsis: true,
          width:200,
        },
        {
          title: '责任人',
          dataIndex: 'liablePersonName',
          ellipsis: true,
          width:200,
        },
        {
          title: '附件',
          dataIndex: 'picture',
          width: 400,
          scopedSlots: { customRender: 'fujian' },
        },
        {
          title: '操作',
          // fixed: 'right',
          dataIndex: 'action',
          width: 200,
          scopedSlots: { customRender: 'action' },
        },
      ],
    }
  },
  
  methods:{
    handleDrag(column){
     return {
     header: {
       cell: (h, props, children) => {
       const { key, ...restProps } = props
       const col = column.find((col) => {
         const k = col.dataIndex || col.key
         return k === key
       })

       if (!col || !col.width) {
         return h('th', { ...restProps }, [...children])
       }

       const dragProps = {
         key: col.dataIndex || col.key,
         class: 'table-draggable-handle',
         attrs: {
           w: 10,
           x: col.width,
           z: 1,
           axis: 'x',
           draggable: true,
           resizable: false,
         },
         on: {
           dragging: (x, y) => {
             col.width = Math.max(x, 1)
           },
         },
       }
       const drag = h(VueDraggableResizable, { ...dragProps })
       return h('th', { ...restProps, class: 'resize-table-th' }, [...children, drag])
     },
   }
   }
    },
  },
  created() {},
}
</script>
 
<style>
.table-draggable-handle {
  /* width: 10px !important; */
  height: 100% !important;
  left: auto !important;
  right: -5px;
  cursor: col-resize;
  touch-action: none;
  border: none;
  position: absolute;
  transform: none !important;
  bottom: 0;
}
.resize-table-th {
  position: relative;
}
</style>
Vue Ant Design是一个基于Vue.jsAnt Design的UI组件库,它提供了许多易于使用和高度可定制的组件,其中包括数据表格。数据表格在数据可视化、数据交互、数据处理等方面都起到了重要作用,而在实际使用中,我们有时需要对表格进行拖拽操作来调整列的顺序或列宽度等。下面将介绍如何在Vue Ant Design中实现表格拖拽功能。 1. 首先,在引入Vue Ant Design的基础上,需要安装 vue-draggable-resizable 插件,该插件提供了拖拽和缩放组件的功能。 2. 创建一个数据表格,并绑定表头数据和表格数据。在表头中添加拖拽事件监听器,在该监听器中调用拖拽组件的相关方法,以实现拖拽操作。例如,对于列宽度的拖拽操作,需要添加拖拽事件监听器到表头中的每一列上,然后在监听器中获取拖拽事件的位置信息和表格度信息,计算得到新的列宽度,最后更新表格列的度属性即可。对于列顺序的拖拽操作,可以在表头的拖拽事件监听器中同样调用拖拽组件的相关方法,以实现列顺序的交换。 3. 在拖拽事件监听器中,还可以使用拖拽组件的其他方法,例如限制拖拽的范围、设置拖拽边界、自定义拖拽样式等,以满足具体的需求。 总之,Vue Ant Design提供了丰富的组件和插件,使得实现表格拖拽功能变得非常简单和高效。开发者只需要根据具体的需求,灵活运用相关的组件和方法,即可实现各种表格拖拽操作,并提升用户体验和数据交互效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值