[ant-design-vue] table组件列宽拖拽功能

vue2.x 拖动table组件列宽功能

环境信息

    "ant-design-vue": "^1.7.1",
    "vue": "^2.6.11",
    "vue-draggable-resizable": "^2.2.0",

相关代码

<template>
    <a-table :columns="columns" :loading="loading" :dataSource="data" :scroll="scroll" :pagination="false" :customRow="customRow" :rowKey="setRowKey" :rowClassName="rowClassName" :components="resizeComp">
    </a-table>
</template>

<script>
import Vue from 'vue';
import VueDraggableResizable from 'vue-draggable-resizable';
// import 'vue-draggable-resizable/dist/VueDraggableResizable.css';
Vue.component('vue-draggable-resizable', VueDraggableResizable);

export default {
    name: "resize-table",
    props: [
        "data",
        "loading",
        "columns",
        "customRow",
        "scroll",
        "rowClassName"
    ],
    data() {
        this.resizeComp = {
            header: {
                cell: (h, props, children) => {
                    const { key, ...restProps } = props;
                    const col = this.columns.find(colItem => {
                        const k = colItem.dataIndex || colItem.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, 10);//留出空白
                            }
                        }
                    };
                    restProps.attrs.widh = col.width;
                    const drag = h('vue-draggable-resizable', { ...dragProps });
                    return h('th', { ...restProps, class: 'resize-table-th' }, [...children, drag])
                }
            },
        };
    },
    methods: {
        setRowKey(record, index) {
            return index;
        }
    }
};
</script>

<style lang="less">
.resize-table-th {
    position: relative;
    .table-draggable-handle {
        height: 100% !important;
        bottom: 0;
        left: auto !important;
        right: -5px;
        cursor: col-resize;
        touch-action: none;
        transform: translate(0px, 0px) !important;
        position: absolute;
        top: 0;
    }
}
</style>

原有的样式文件没有使用的必要,个人添加的部分样式内容就符合需求了

vue3.x 拖动table组件列宽功能

环境信息

    "ant-design-vue": "^3.2.13",
    "vue": "^3.2.45",

相关代码

vue3.x对应的ant-design-vue中的table组件本身支持列宽的拖动了,不需求额外的包的支持,根据Api说明设置resizeColumn即可

<template>
  <a-table
    :columns="options.columns"
    :loading="options.loading"
    :dataSource="options.data"
    :scroll="options.scroll"
    :customRow="options.customRow"
    :rowKey="options.setRowKey"
    :rowClassName="options.rowClassName"
    :row-selection="options.rowSelection"
    @resizeColumn="handleResizeColumn"
    :bordered="options.bordered"
  >
  </a-table>
</template>
<script lang="ts" setup>
import { ref, reactive } from "vue";

defineProps({
	options: {
		type: Object,
		require: true
	}
})
const handleResizeColumn = (w, col) => {
	col.width = w;
};
</script>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Ant Design Vue 的表格组件支持拖拽列的功能。具体实现方法可以参考官方文档中的示例代码。在表格组件中,可以通过设置 `drag-and-drop` 属性为 `true` 来开启拖拽列的功能。同时,还需要设置 `columns` 属性为一个数组,数组中的每个元素表示一列的配置信息,包括列的标题、数据字段、宽度等。在拖拽列时,可以通过监听 `onColumnDragEnd` 事件来获取拖拽后的列的顺序信息,然后根据顺序信息重新渲染表格。 ### 回答2: ant-design-vue table是一个基于Vue框架构建的图形用户界面组件库,其table组件提供了丰富的功能,其中包括拖拽列。下面我们来详细介绍一下如何实现ant-design-vue table拖拽功能。 首先,我们需要在table组件的配置中增加一个属性:columnsResizable,将其设置为true,该属性作用是启用列宽调整的功能。然后,我们需要在table组件的html中增加一个slot,定义列头的内容,方便后续处理拖拽事件。关于slot的具体用法请自行查阅官方文档。 接下来,我们需要通过样式将table的列头设置为可拖拽的状态。可以通过设置th元素的cursor属性为col-resize来实现,同时为th元素绑定mousedown事件,当用户拖拽列头时,就可以触发该事件,然后调用对应的处理函数。 在处理函数中,我们需要先获取当前列头所在的位置,然后记录下鼠标的初始位置。接着监听mousemove事件,当鼠标移动时,计算出当前列头的目标宽度,并通过css样式设置列头的宽度,同时更新对应列的宽度。最后,当鼠标松开时,释放事件监听。 除此之外,我们还需要注意一些细节问题,例如列拖拽时保持整个table的宽度不变,下一列的位置和宽度需要同步调整等。这些都需要我们在代码中仔细处理,以避免出现意外的问题。 总之,通过以上步骤,我们就可以成功实现ant-design-vue table拖拽功能了。当然,具体实现方式可能因人而异,这里只是提供一种参考思路,希望对大家有所帮助。 ### 回答3: Ant Design Vue是一款基于Vue的企业级UI库,它提供了丰富的组件和样式,可以直接应用于业务中。其中的table组件支持拖拽列,可以使用户根据自身需求自由排序table中的列。 Ant Design Vuetable组件可以通过列对象属性的方式自定义table的列,其中包括每一列的数据源、表头、宽度等属性。在这些属性中,index属性会在表头中显示列的序号,同时也可以用作table中列的排序。 拖拽列的实现可以通过拖拽事件来实现。拖拽事件包括dragstart、dragover、drop和dragend四种事件。其中dragstart事件在拖动元素时触发,可以在事件中将当前列的index属性传递给被拖动元素;dragover事件在拖动元素进入目标元素时触发,可以在事件中获取目标列的index属性,并用作当前列和目标列的交换;drop事件在拖动元素松开鼠标时触发,可以在事件中触发交换列的逻辑;dragend事件在拖动元素结束时触发,可以在事件中清空拖动元素的状态。 在实现拖拽列的过程中,还需要考虑数据的绑定。拖拽列并不会改变table的数据源,因此需要手动更新数据源中每一列的index属性。同时,在交换列的时候,需要考虑表头和单元格中数据的同步更新。 总的来说,Ant Design Vuetable组件拖拽列的实现相对简单,可以通过拖拽事件和数据源的操作来实现。在用户体验上,拖拽列可以大大提高用户对table的操作效率,同时也增加了table的交互性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三知之灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值