parent
d7561734ea
commit
1c9e9e2418
@ -0,0 +1,142 @@
|
||||
<cn>
|
||||
#### 可伸缩列
|
||||
集成 [vue-draggable-resizable](https://github.com/mauricius/vue-draggable-resizable) 来实现可伸缩列。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### Resizable column
|
||||
Implement resizable column by integrate with [vue-draggable-resizable](https://github.com/mauricius/vue-draggable-resizable).
|
||||
</us>
|
||||
|
||||
<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>
|
Loading…
Reference in new issue