当前位置: 首页 > news >正文

vue3+elementPlus穿梭框拖拽

安装

npm install sortablejs --save

<template><div class="transfer" ref="transfer"><div><el-transfer v-model="inputForm" :data="data" :titles="titles"><template #default="{ option }"><div class="pannel-content"><span :draggable="!option.disabled" @dragstart="drag($event, option)">{{ option.label}}</span></div></template></el-transfer><el-button @click="submit">确定</el-button></div></div>
</template><script lang="ts" setup>
import { TransferDataItem } from 'element-plus';
import Sortable from 'sortablejs';
const props = withDefaults(defineProps<{data: TransferDataItem[],titles?: [string, string]
}>(), {data: () => [{key: '111',label: `选项一`,disabled: false,}, {key: '222',label: `选项二`,disabled: false,}, {key: '333',label: `选项三`,disabled: false,}, {key: '444',label: `选项四`,disabled: false,}],titles: () => ['单个拖拽待选', '已选列表']
})
const data = computed(() => props.data)
const titles = computed(() => props.titles)const inputForm = ref([] as any)
const draggingKey = ref(null as any)
const transfer = ref<HTMLDivElement | null>(null)
const drag = (ev: DragEvent, option: any) => {draggingKey.value = option.key
}
onMounted(() => {const leftPanel = transfer?.value?.getElementsByClassName("el-transfer-panel")[0].getElementsByClassName("el-transfer-panel__body")[0] as any;const rightPanel = transfer?.value?.getElementsByClassName("el-transfer-panel")[1].getElementsByClassName("el-transfer-panel__body")[0] as any;const leftEl = leftPanel?.getElementsByClassName("el-transfer-panel__list")[0]const rightEl = rightPanel?.getElementsByClassName("el-transfer-panel__list")[0]Sortable.create(rightEl, {onEnd: (evt: any) => {const { oldIndex, newIndex } = evt;const temp = inputForm.value[oldIndex]if (!temp || temp === 'undefined') return;// 解决右边最后一项从右边拖左边,有undefined的问题inputForm.value[oldIndex] = inputForm.value[newIndex]inputForm.value[newIndex] = temp}})Sortable.create(leftEl, {onEnd: (evt: any) => {const { oldIndex, newIndex } = evt;if (oldIndex === newIndex) return;const temp = data.value[oldIndex]if (!temp || (temp as any) === 'undefined') return;// 解决右边最后一项从右边拖左边,有undefined的问题data.value[oldIndex] = data.value[newIndex]data.value[newIndex] = temp}})leftPanel.ondragover = (ev: any) => {ev.preventDefault()}leftPanel.ondrop = (ev: any) => {ev.preventDefault();const index = inputForm.value.indexOf(draggingKey.value)if (index !== -1) {inputForm.value.splice(index, 1)}}rightPanel.ondragover = (ev: any) => {ev.preventDefault()}rightPanel.ondrop = (ev: any) => {ev.preventDefault();if (inputForm.value.indexOf(draggingKey.value) === -1) {inputForm.value.push(draggingKey.value)}}
})
function submit() {console.log(inputForm.value);}
</script>
<style scoped lang="scss">
:deep(.el-transfer__button) {width: 30px;
}
</style>
http://www.xdnf.cn/news/555211.html

相关文章:

  • MONA:5%参数微调超越全量微调,CVPR2025新型视觉适配器
  • Linux学习心得问题整理(二)
  • 工业智能网关在工业锅炉安全监控中的组网配置指南
  • C++ QT 与 win32 窗口可以互操作
  • HarmonyOS5云服务技术分享--ArkTS开发函数
  • SpringBootDay1|面试题
  • 环特生物董事长汤珣、执行总经理张勇赴白云美湾国际化妆品研究院集群考察调研
  • ES6核心特性与语法
  • HarmonyOS5云服务技术分享--ArkTS调用函数
  • DAY 30 超大力王爱学Python
  • 2025最新的自动化测试面试题【答案+文档】
  • protobuf原理和使用
  • 接口测试速成指南:基础知识+工具使用全解析
  • 如何使用通义灵码提高前端开发效率
  • 2W+安全事件警示:10次数据泄露,6次与“人”有关
  • GESP2024年12月认证C++二级( 第三部分编程题(1)寻找数字)
  • [python] 轻量级定时任务调度库schedule使用指北
  • 阿里云百炼(1) : 阿里云百炼应用问答_回答图片问题_方案1_提问时上传图片文件
  • 一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异
  • 如何理解大模型的幻觉输出及RAG技术的应用与实战案例
  • 批量替换文字
  • ArcObjects学习教程
  • JAVA基础——输入输出和运算符
  • 迪杰斯特拉
  • RGB-D数据集汇总(2025年05月更新....)
  • 差动讯号(2):奇模与偶模
  • Python日志功能的使用
  • vue+three.js 五彩烟花效果封装+加载字体
  • AI一周事件(2025年5月13日-5月19日)
  • 外部因素导致的 ADC误差来源分析