fe-core-cli
Version:
All-in-one scaffolding, cli integrated with Vue3 ecological chain, cli of H5 page, mock template cli of Node
100 lines (80 loc) • 2.67 kB
text/typescript
import { ref } from 'vue'
import { insertTargetArr } from '../array'
const TABLE_ROW_CLASS = 'ant-table-row'
const TABLE_CLASS = 'ant-table'
const TABLE_ROW_DRAG_TARGET = 'ksg-common__table-drag-target'
/**
* 表格实现行拖拽的hook
*/
export const useTableDraggable = <T>(
dataSource: T[],
callBack: (data: T[], originData: T[], sourceIndex: number, targetIndex: number) => void
) => {
// const sourceObj = ref<T>();
// const targetObj = ref<T>();
const sourceIndex = ref()
const targetIndex = ref()
const customRow = (record: T, index: number) => {
// 开始拖拽
const onDragstart = (event: DragEvent) => {
const ev = event || window.event
ev.stopPropagation()
// 得到源目标数据
// sourceObj.value = record;
sourceIndex.value = index
}
// 拖动元素经过的元素
const onDragover = (event: DragEvent) => {
const ev = event || window.event
ev.preventDefault()
const dataTransfer: DataTransfer | null = ev.dataTransfer
if (dataTransfer) {
dataTransfer.dropEffect = 'move'
dataTransfer.effectAllowed = 'move'
}
targetIndex.value = index
}
// 拖动到达目标元素
const onDragenter = (event: Event) => {
const ev = event || window.event
const closestTableElement = (ev.target as HTMLElement).closest(`.${TABLE_CLASS}`)
ev.preventDefault()
const list = closestTableElement?.getElementsByClassName(TABLE_ROW_CLASS)
const node = closestTableElement?.getElementsByClassName(TABLE_ROW_DRAG_TARGET)
if (node?.length) {
node[0].classList.remove(TABLE_ROW_DRAG_TARGET)
}
if (list?.length) {
list[index].classList.add(TABLE_ROW_DRAG_TARGET)
}
}
// 鼠标松开
const onDrop = (event: Event) => {
const ev = event || window.event
ev.stopPropagation()
// 得到目标数据
// targetObj.value = record;
targetIndex.value = index
const closestTableElement = (ev.target as HTMLElement).closest(`.${TABLE_CLASS}`)
const node = closestTableElement?.getElementsByClassName(TABLE_ROW_DRAG_TARGET)
if (node?.length) {
node[0].classList.remove(TABLE_ROW_DRAG_TARGET)
}
if (targetIndex.value === sourceIndex.value) {
return
}
const resultData = insertTargetArr(dataSource, sourceIndex.value, targetIndex.value)
callBack(resultData, dataSource, sourceIndex.value, targetIndex.value)
}
return {
onDragstart,
onDragover,
onDrop,
onDragenter
}
}
return {
customRow
}
}
export default useTableDraggable