024el-tree中的DataTransfer.setDragImage()方法实现拖拽节点的Dom自定义展示

024el-tree中的DataTransfer.setDragImage()方法实现拖拽节点的Dom自定义展示

示例代码

function handleDragStart(node: Node, ev: DragEvents) {
   
  // 通过Dom节点获取到要展示的Dom
  const mDom =
    ev.target.firstElementChild.lastElementCh
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
优化这段代码 let currentDropTarget: any; let transferredImage: HTMLElement | null; function dragTable(e: DragEvent) { if (!e || !e.dataTransfer) return; currentDropTarget = e.target; const field: string | number | undefined = (e.target as HTMLElement)?.id; const column = columnAll.value.find((c) => c.field == field)!; const showedElement = generateDragImage(column?.name); e.dataTransfer?.setDragImage(showedElement || document.body, 0, 0); e.dataTransfer.setData("text/plain", field); } function generateDragImage(name: string) { transferredImage = document.createElement("div"); document.body.appendChild(transferredImage); transferredImage.className = "table-header-transferred-image"; transferredImage.innerText = name; return transferredImage; } const changeBorder = throttle((target) => { if ( (target.draggable || target.classList.contains("s2-index-header")) && currentDropTarget && currentDropTarget != target ) { changeClassName(false); currentDropTarget = target; changeClassName(true); } }, 100); function allowDrop(e: MouseEvent) { e.preventDefault(); const target = e.target as HTMLElement; if (target) changeBorder( target.draggable || target.classList.contains("s2-index-header") ? target : target.parentNode ); } function dropTable(e: DragEvent) { e.preventDefault(); if (!e) return; const dragField = e.dataTransfer?.getData("text/plain") || ""; const dropField = (e.target as HTMLElement)?.id; if (dragField && dropField && dragField != dropField) { changeColumnOrder(dragField, dropField); } } function onDragend() { changeClassName(false); currentDropTarget = undefined; transferredImage && document.body.removeChild(transferredImage); } function changeClassName(isAdded: boolean) { if (isAdded) currentDropTarget.classList.add("s2-self-defined-dom-border"); else currentDropTarget.classList.remove("s2-self-defined-dom-border"); } function changeColumnOrder(dragField: string, dropField: string) { const dragIndex = columnAll.value.findIndex( (item) => item.field == dragField ); const dragColumn = columnAll.value.splice(dragIndex, 1)[0]; const dropIndex = dropField == "-1" ? -1 : columnAll.value.findIndex((item) => item.field == dropField); columnAll.value.splice(dropIndex + 1, 0, dragColumn); dataManager.updateDataConfig({ meta: columnAll.value }); tableManager?.render(dataManager.getFormattedData()); onColumnShowChange(); }
06-01
这段代码可以进行如下优化: 1. 使用类型定义来提高代码可读性和类型安全性; 2. 使用解构赋值来简化代码; 3. 函数名可以更具描述性; 4. 使用可选链操作符来简化代码。 优化后的代码如下: ```typescript type Column = { field: string | number | undefined; name: string; }; let currentDropTarget: HTMLElement | undefined; let transferredImage: HTMLElement | | undefined; function handleDragStart(e: DragEvent): void { const { dataTransfer, target } = e; if (!dataTransfer) return; const field = (target as HTMLElement)?.id; const column = columnAll.value.find((c) => c.field === field)!; const showedElement = generateDragImage(column.name); dataTransfer.setDragImage(showedElement || document.body, 0, 0); dataTransfer.setData("text/plain", field); currentDropTarget = target as HTMLElement; } function generateDragImage(name: string): HTMLElement { transferredImage = document.createElement("div"); document.body.appendChild(transferredImage); transferredImage.className = "table-header-transferred-image"; transferredImage.innerText = name; return transferredImage; } const changeBorder = throttle((target: HTMLElement): void => { if ( (target.draggable || target.classList.contains("s2-index-header")) && currentDropTarget && currentDropTarget !== target ) { changeClassName(false); currentDropTarget = target; changeClassName(true); } }, 100); function handleDragOver(e: MouseEvent): void { e.preventDefault(); const target = e.target as HTMLElement; if (!target) return; const node = target.draggable ? target : target.closest(".s2-index-header"); if (node) changeBorder(node); } function handleDrop(e: DragEvent): void { e.preventDefault(); const dragField = e.dataTransfer?.getData("text/plain") || ""; const dropField = (e.target as HTMLElement)?.id || ""; if (dragField && dropField && dragField !== dropField) { changeColumnOrder(dragField, dropField); } } function handleDragEnd(): void { changeClassName(false); currentDropTarget = undefined; transferredImage && document.body.removeChild(transferredImage); } function changeClassName(isAdded: boolean): void { if (!currentDropTarget) return; const className = "s2-self-defined-dom-border"; isAdded ? currentDropTarget.classList.add(className) : currentDropTarget.classList.remove(className); } function changeColumnOrder(dragField: string, dropField: string): void { const dragIndex = columnAll.value.findIndex((item) => item.field === dragField); const dragColumn = columnAll.value.splice(dragIndex, 1)[0]; const dropIndex = dropField === "-1" ? -1 : columnAll.value.findIndex((item) => item.field === dropField); columnAll.value.splice(dropIndex + 1, 0, dragColumn); dataManager.updateDataConfig({ meta: columnAll.value }); tableManager?.render(dataManager.getFormattedData()); onColumnShowChange(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿赛工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值