使用ant design vue中a-table实现自定义列拖拽 以及解决列拖拽时表格大小跟着变化的问题

文章展示了如何在Vue应用中使用AntDesignVue库创建表格,并实现列拖拽及根据列宽动态隐藏功能。通过设置`resizable`属性和处理`handleResizeColumn`函数,可以调整列宽并控制总宽度超过特定值时的最后一列是否显示省略号和隐藏。

函数和css部分如下:

<script lang="ts">

import { TableColumnsType } from "ant-design-vue"

import { ref, reactive } from "vue";

let isHidden = ref<boolean>(false);

// columns是关于列的配置项,在需要被拖拽的列中加入resizable: true

//注意!写了resizable: true属性的列一定定义width,方便后面计算列宽,没写resizable: true一定不能定义width,否则表格整体会随着列的拖拽一起变宽

const columns = ref<TableColumnsType>([

    { title: 'id', dataIndex: 'id', key: 'id', width: 80, resizable: true, minWidth: 80},

    { title: 'name', dataIndex: 'name', key: 'name', ellipsis: true, resizable: true, minWidth: 100 ,width: 150 },

    { title: 's', dataIndex: 's', key: 's', ellipsis: true, resizable: true, width:150},

    { title: 'v', dataIndex: 'v', key: 'v', ellipsis: true },

    { title: 't', dataIndex: 't', key: 't', ellipsis: true },

    { title: 'e', dataIndex: 'e', key: 'e' },

]);

// 列表中的data

const getList = reactive([

    {id:'1',name:'name',s:'s',v:'0.1',t:'2023',e:true},

    {id:'1',name:'name',s:'s',v:'0.1',t:'2023',e:true},

    {id:'1',name:'name',s:'s',v:'0.1',t:'2023',e:true},

    {id:'1',name:'name',s:'s',v:'0.1',t:'2023',e:true},

    {id:'1',name:'name',s:'s',v:'0.1',t:'2023',e:true}

])

//实现列拖拽功能的函数

const handleResizeColumn = (w: number, col: any) => {

    if (col) {

        col.width = w;

    }

    var width = Number(columns.value[0].width) + Number(columns.value[1].width) + Number(columns.value[2].width)

    if (width>550) {    //当被拖拽的三列宽度相加超过一定数值时 将超出部分隐藏

        columns.value[5].ellipsis = true

        isHidden.value = true

    } else {

        columns.value[5].ellipsis = false

        isHidden.value = false

    }

}

export default ({

    setup() {

        getList

        return {

            getList,

            isHidden,

            columns,

            handleResizeColumn

        };

    },

});

</script>

<style scoped lang="scss">

    .table_hidden {

        overflow: hidden;

    }

</style>

html部分如下:

<template>

        <div :class="isHidden ? 'table_hidden' : ' '" style="width: 900px; margin-left: 25%;">

            <!-- 当isHidden为true时 为div加上table_hidden的样式 即超出部分隐藏 这样拖拽时跟着移动的表格部分就会被隐藏了 -->

            <!-- 也可以直接为这个div加上超出部分隐藏的属性 我是因为还有一些特殊的需求不能让他直接隐藏 只能判断当宽度大于一定值时再隐藏 -->

            <a-table :columns="columns" :data-source="getList" class="list_body"

                 style="width:100%" @resizeColumn="handleResizeColumn">

            </a-table>

            <!-- @resizeColumn="handleResizeColumn" 设置列拖拽方法 handleResizeColumn是拖拽时调用的函数-->

        </div>

</template>

ant-design-vue 的 a-table实现拖拽功能,有不同的方式。一种是参考官方文档推荐集成 vue-draggable-resizable 来实现,但官方 demo 存在 bug 且使用较麻烦,也可自己动手在 ant-design-vue 1x 表格组件基础上实现伸缩功能,这意味着可以按照自己的思路去编码实现拖拽插件,不过未提及具体的实现步骤 [^1]。 另一种尝试集成 vue-draggable-resizable 实现可伸缩遇到了各种问题,比如 columns 数据没写 width、部分未设置 dataIndex 和 key、表格使用复选框后报错“Cannot read property ‘width’ of undefined” ,但同样未给出解决这些问题以成功实现拖拽插件的方法 [^2]。 以下是一个简单示例展示如何使用第三方库实现拖拽功能(以 sortablejs 为例): ```vue <template> <a-table :columns="columns" :data-source="dataSource"> <template #headerCell="{ column }"> <div v-if="column.title" :draggable="true" @dragstart="onDragStart(column)" @dragover.prevent @drop="onDrop(column)">{{ column.title }}</div> <template v-else>{{ column.title }}</template> </template> </a-table> </template> <script> import Sortable from 'sortablejs'; import { defineComponent, ref, onMounted } from 'vue'; export default defineComponent({ setup() { const columns = ref([ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, ]); const dataSource = ref([ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', }, ]); let draggedColumn = null; const onDragStart = (column) => { draggedColumn = column; }; const onDrop = (targetColumn) => { const fromIndex = columns.value.indexOf(draggedColumn); const toIndex = columns.value.indexOf(targetColumn); if (fromIndex !== -1 && toIndex !== -1) { const newColumns = [...columns.value]; newColumns.splice(fromIndex, 1); newColumns.splice(toIndex, 0, draggedColumn); columns.value = newColumns; } }; onMounted(() => { const tableHeader = document.querySelector('.ant-table-thead'); if (tableHeader) { new Sortable(tableHeader, { animation: 150, onEnd: (evt) => { const newColumns = [...columns.value]; const [movedColumn] = newColumns.splice(evt.oldIndex, 1); newColumns.splice(evt.newIndex, 0, movedColumn); columns.value = newColumns; }, }); } }); return { columns, dataSource, onDragStart, onDrop, }; }, }); </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值