ant-design-vue table 可伸缩列
ant-design-vue table 可伸缩列由于业务中需要表格伸缩列,在官网文档中也有相关demo, 由于官方文档中使用的方式没有成功,所以自己研究了一套方式相关基础库"vue-draggable-resizable": "^2.2.0","@vue/composition-api": "^1.0.0-beta.17","ant-design-vue": "^1.6.5",第一步 实现可伸缩
·
ant-design-vue table 可伸缩列
由于业务中需要表格伸缩列,在官网文档中也有相关demo, 由于官方文档中使用的方式没有成功,所以自己研究了一套方式
相关基础库
"vue-draggable-resizable": "^2.2.0",
"@vue/composition-api": "^1.0.0-beta.17",
"ant-design-vue": "^1.6.5",
第一步 实现可伸缩列组件
const ResizeableTitle = (h, props, children) => {
const { onResize, width, isDraggable } = props.props
if (!width) {
return <th {...props}>{children}</th>
}
console.log(isDraggable)
return (
<th key={props.key} class={[props.class, 'resize-table-th']} width={width}>
{children}
<vue-draggable-resizable
key={props.key}
class-name="table-draggable-handle"
w={10}
x={width}
z={1}
axis="x"
draggable={isDraggable}
resizable={false}
onDragging={onResize}
/>
</th>
)
}
第二步 在原来table组件的基础上再次封装,方便业务使用
import { defineComponent, reactive, computed } from '@vue/composition-api'
import './index.less'
export default defineComponent({
props: {
columns: {
type: Array,
default: () => []
},
dataSource: {
type: Array,
default: () => []
},
bordered: {
type: Boolean,
default: true
}
},
setup (props, ctx) {
const tableState = reactive({
size: 'default'
})
const draggingMap = {}
props.columns.forEach(col => {
draggingMap[col.key] = col.width
})
const draggingState = reactive(draggingMap)
const handleResize = (key) => {
return (size) => {
const column = props.columns.find(col => col.key === key)
column.min = column.width
draggingState[key] = size
}
}
return () => {
const columns = props.columns.map((col, idx) => {
if (col.slots) {
Object.keys(col.slots).forEach(slotkey => {
const slotName = col.slots[slotkey]
if (ctx.slots[slotName]) {
col[slotkey] = ctx.slots[slotName]()
}
})
}
const renderFuncName = col.scopedSlots?.customRender
if (renderFuncName) {
col.customRender = ctx.slots[renderFuncName]
}
return {
...col,
customHeaderCell: column => {
return {
props: {
width: draggingState[column.key],
isDraggable: true,
onResize: handleResize(column.key)
}
}
}
}
})
const tableProps = {
columns,
dataSource: props.dataSource,
bordered: props.bordered,
size: tableState.size,
rowKey: 'id',
components: {
header: {
cell: ResizeableTitle
}
}
}
return <div class="vc-table" >
<a-table {...{ props: tableProps }}></a-table>
</div>
}
}
})
index.less
.vc-table {
.resize-table-th {
position: relative;
}
.table-draggable-handle {
position: absolute;
top: 0;
left: -5px;
background-color: red;
cursor: col-resize;
touch-action: none;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)