table 的列可以拖动
问题1 :demo 无法运行
1. 直接拷贝代码过来,发现传的参数有问题:
<template>
<a-table bordered :columns="columns" :components="components" :dataSource="data">
<template v-slot:action>
<a href="javascript:;">Delete</a>
</template>
</a-table>
</template>
<script>
import Vue from 'vue';
import VueDraggableResizable from 'vue-draggable-resizable';
Vue.component('vue-draggable-resizable', VueDraggableResizable);
const columns = [
{
title: 'Date',
dataIndex: 'date',
width: 200,
},
{
title: 'Amount',
dataIndex: 'amount',
width: 100,
},
{
title: 'Type',
dataIndex: 'type',
width: 100,
},
{
title: 'Note',
dataIndex: 'note',
width: 100,
},
{
title: 'Action',
key: 'action',
scopedSlots: { customRender: 'action' },
},
];
const data = [
{
key: 0,
date: '2018-02-11',
amount: 120,
type: 'income',
note: 'transfer',
},
{
key: 1,
date: '2018-03-11',
amount: 243,
type: 'income',
note: 'transfer',
},
{
key: 2,
date: '2018-04-11',
amount: 98,
type: 'income',
note: 'transfer',
},
];
const draggingMap = {};
columns.forEach(col => {
draggingMap[col.key] = col.width;
});
const draggingState = Vue.observable(draggingMap);
const ResizeableTitle = (h, props, children) => {
let thDom = null;
const { key, ...restProps } = props;
const col = columns.find(col => {
const k = col.dataIndex || col.key;
return k === key;
});
if (!col.width) {
return <th {...restProps}>{children}</th>;
}
const onDrag = (x, y) => {
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.key}
class="table-draggable-handle"
w={10}
x={draggingState[key] || col.width}
z={1}
axis="x"
draggable={true}
resizable={false}
onDragging={onDrag}
onDragstop={onDragstop}
></vue-draggable-resizable>
</th>
);
};
export default {
name: 'App',
data() {
this.components = {
header: {
cell: ResizeableTitle,
},
};
return {
data,
columns,
};
},
};
</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;
}
}
</style>
2. 将标黄的部分改为,代码如下:
const ResizeableTitle = (h1) => {
const props = h1.props
const children = h1.children
问题二:应用到ant vue界面时,需要做如下修改:
1. 将下列代码挪到main.js
import VueDraggableResizable from 'vue-draggable-resizable'
Vue.component('vue-draggable-resizable', VueDraggableResizable)
2. 将下列代码copy过去。
import Vue from 'vue'
// #region 从Table1 拷贝的东东
const draggingMap = {}
columns.forEach(col => {
draggingMap[col.Id] = col.width
})
const draggingState = Vue.observable(draggingMap)
const ResizeableTitle = (h1) => {
const props = h1.props
const children = h1.children
let thDom = null
const { key, ...restProps } = props
const col = columns.find(col => {
const k = col.dataIndex || col.Id
return k === key
})
if ((!col) || (!col.width)) {
return <th {...restProps}>{children}</th>
}
const onDrag = (x, y) => {
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.rowKey}
class="table-draggable-handle"
w={10}
x={draggingState[key] || col.width}
z={1}
axis="x"
draggable={true}
resizable={false}
onDragging={onDrag}
onDragstop={onDragstop}
></vue-draggable-resizable>
</th>
)
}
// #endregion
3. 拷贝样式
<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;
}
}
</style>
4. 表格的width=100 必须为数字的
5.columns 操作列增加 key: 'action', Id: 'action'
const columns = [
...
{ title: '操作', dataIndex: 'action', scopedSlots: { customRender: 'action' } }
]
const columns = [
...
{ title: '操作', dataIndex: 'action', key: 'action', Id: 'action', scopedSlots: { customRender: 'action' } }
]
6.<a-table>标签添加vue属性:components="components"
<a-table
ref="table"
:components="components"
:columns="columns"
7.在data中增加 this.components
export default {
components: {
EditForm
},
mounted () {
this.getDataList()
},
data () {
this.components = {
header: {
cell: ResizeableTitle
}
}
return {
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!