Vue项目(Ant Design of Vue)踩坑记之——表格header可伸缩

务必注意事项:

  1. vue-draggable-resizable的版本必须是2.1.0,其他版本有冲突。
    npm install vue-draggable-resizable@2.1.0;
  2. 必须在table-draggable-handle样式中加入:transform:none; position:absolute 否则不起效果;
// 表格拖拽
.resize-table-th {
    position: relative;
    .table-draggable-handle {
        transform: none !important;
        position: absolute;
        height: 100% !important;
        bottom: 0;
        left: auto !important;
        right: -5px;
        cursor: col-resize;
        touch-action: none;
        border: none;
    }
}
  1. 表格要加bordered属性,以及colums数据中一定要加width宽度,不然会报错;

  2. 表格的colums数据中要加dataIndex 或者key属性,否则报错。columnsItem中不一定都是key,(大部分不是key);

  3. <a-table>标签添加vue属性:components=“components”
    表格加了复选框时,colundefined,需要添加判断;
    在这里插入图片描述

  4. columns必须定义在data中,放在计算属性(多语言)中拖拽不生效;==》在data中定义,methods中的初始化表头的方法initColumns返回,切换多语言时,重新调用初始化方法initColumns
    在这里插入图片描述

  5. 切换多语言后,表格不可拖拽;==》给table添加v-if="tableVisible"

reloadTable() {
    (this as any).tableVisible = false;
    (this as any).$nextTick(() => {
        (this as any).tableVisible = true;
    });
},

在这里插入图片描述
在这里插入图片描述

drag.js文件

import Vue from 'vue';
const initDrag = function(tbCols) {
    const draggingMap = {};
    tbCols.forEach((col) => {
        const key = col.dataIndex || col.key; //这儿要求表格数据中要有这两个属性
        draggingMap[key] = col.width || 0;
    });
    const draggingState = Vue.observable(draggingMap);
    return (h, props, children) => {
        let thDom = null;
        const { key, ...restProps } = props;
        let col;
        if (key === 'selection-column') {
            //表格加了复选框,不加这个判断col会是undefided
            col = {};
        } else {
            col = tbCols.find((item) => {
                const k = item.dataIndex || item.key;
                return k === key;
            });
        }
        //这儿要求表格数据中要有宽width属性,若是没有是不会执行下面的拖拽的
        if (!col || !col.width) {
            return <th {...restProps}>{children}</th>;
        }
        const onDrag = (x) => {
            draggingState[key] = 0;
            col.width = Math.max(x, 1);
        };

        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.dataIndex || col.key}
                    class="table-draggable-handle"
                    w={10}
                    x={col.width || draggingState[key]}
                    z={1}
                    axis="x"
                    draggable={true}
                    resizable={false}
                    onDragging={onDrag}
                    onDragstop={onDragstop}
                ></vue-draggable-resizable>
            </th>
        );
    }
}
export default initDrag;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值