tangjinzhou
5 years ago
4 changed files with 150 additions and 2 deletions
@ -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