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

vue3+elementPlus穿梭框单个拖拽和全选拖拽

在这里插入图片描述

在这里插入图片描述

安装 sortablejs

npm install sortablejs --save

<template><div class="transferBox"><el-transfer ref="transfer" v-model="inputForm.workingProcedure" :titles="titles"target-order="push" :props="transferProps" :data="transferData" @left-check-change="leftCheckChange"@right-check-change="rightCheckChange"><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>
</template><script setup lang="ts">
import { TransferDataItem } from 'element-plus';
import Sortable from 'sortablejs';
const props = withDefaults(defineProps<{data: TransferDataItem[],titles?: [string, string]
}>(), {data: () => [{ id: '1', label: '测试1', disabled: true },{ id: '2', label: '测试2', disabled: false },{ id: '3', label: '测试3', disabled: false },{ id: '4', label: '测试4', disabled: false }],titles: () => ['多个拖拽未选择', '已选择']
})
const transferData = computed(() => props.data);
const titles = computed(() => props.titles)
const transferLeftCheckData = ref<string[]>([]);
const transferRightCheckData = ref<string[]>([]);
const draggingKey = ref<string>('');
const inputForm = ref({ workingProcedure: [] });
const transferProps = ref({ key: 'id', label: 'label' });const transfer = ref(null);const drag = (ev: DragEvent, option: any) => {console.log(option);draggingKey.value = option.id;
};const leftCheckChange = (val: string[]) => {transferLeftCheckData.value = val;
};const rightCheckChange = (val: string[]) => {transferRightCheckData.value = val;
};
function submit() {console.log(inputForm.value.workingProcedure);
}
onMounted(() => {const transferEl = transfer.value?.$el;if (!transferEl) return;const leftPanel = transferEl.getElementsByClassName('el-transfer-panel')[0].getElementsByClassName('el-transfer-panel__body')[0];const rightPanel = transferEl.getElementsByClassName('el-transfer-panel')[1].getElementsByClassName('el-transfer-panel__body')[0];const rightEl = rightPanel.getElementsByClassName('el-transfer-panel__list')[0];Sortable.create(rightEl, {onEnd: (evt) => {const { oldIndex, newIndex } = evt;const temp = inputForm.value.workingProcedure[oldIndex];if (!temp || temp === 'undefined') return;inputForm.value.workingProcedure[oldIndex] = inputForm.value.workingProcedure[newIndex];inputForm.value.workingProcedure[newIndex] = temp;},});const leftEl = leftPanel.getElementsByClassName('el-transfer-panel__list')[0];Sortable.create(leftEl, {onEnd: (evt) => {const { oldIndex, newIndex } = evt;const temp = transferData.value[oldIndex];if (!temp || temp === 'undefined') return;transferData.value[oldIndex] = transferData.value[newIndex];transferData.value[newIndex] = temp;},});leftPanel.ondragover = (ev) => ev.preventDefault();leftPanel.ondrop = (ev) => {ev.preventDefault();const index = inputForm.value.workingProcedure.indexOf(draggingKey.value);if (index !== -1) {if (transferRightCheckData.value.indexOf(draggingKey.value) !== -1) {transferRightCheckData.value.reduce((arr, item) => {if (arr.indexOf(item) !== -1) {arr.splice(arr.indexOf(item), 1);}return arr;}, inputForm.value.workingProcedure)// 清除右侧选中的 不然下次向左拉取时会有缓存transferRightCheckData.value = [];} else {// 否则就只拉取当前一个inputForm.value.workingProcedure.splice(index, 1);}}};rightPanel.ondragover = (ev) => ev.preventDefault();rightPanel.ondrop = (ev) => {ev.preventDefault();if (inputForm.value.workingProcedure.indexOf(draggingKey.value) === -1) {if (transferLeftCheckData.value.indexOf(draggingKey.value) !== -1) {inputForm.value.workingProcedure = inputForm.value.workingProcedure.concat(transferLeftCheckData.value);transferLeftCheckData.value = [];} else {// 否则就只拉取当前一个inputForm.value.workingProcedure.push(draggingKey.value);}}};
});
</script>
<style scoped lang="scss">
:deep(.el-transfer__button) {width: 30px;
}
</style>

相关文章:

  • Linux网络基础全面解析:从协议分层到局域网通信原理
  • 【原创】ubuntu22.04下载编译AOSP 15
  • Git的windows开发与linux开发配置
  • femap许可与云计算集成
  • 量子通信技术:原理、应用与未来展望
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - 3 项目目录结构
  • Vue百日学习计划Day43-45天详细计划-Gemini版
  • 怎样解决photoshop闪退问题
  • ajax post请求 解决自动再get请求一次
  • 深度剖析ZooKeeper
  • 新书速览|GraphPad Prism图表可视化与统计数据分析:视频教学版
  • 接口自动化可视化展示
  • 业务流程和数据结构之间如何对应
  • 2025.05.20【Treemap】树图数据可视化技巧
  • 云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)
  • 精益数据分析(73/126):黏性阶段的功能优先级法则——七问决策模型与风险控制
  • SpringBoot集成Jasypt对数据库连接密码进行加密、解密
  • 请问交换机和路由器的区别?vlan 和 VPN 是什么?
  • ip地址改了网络还能用吗?ip地址改了有什么后果
  • OSI 网络七层模型中的物理层、数据链路层、网络层
  • 失智老人有两个儿子却欠费住养老院两年多,法检合力指定监护人
  • 墨西哥城市长私人秘书及顾问遇袭身亡
  • 中国海警就菲向非法“坐滩”仁爱礁军舰运补发表谈话
  • 特朗普亲家有了新工作:美国驻法大使
  • 上海发布台风红色预警?实为演练,今日下午局部中雨下班请注意
  • 中国戏剧梅花奖终评结果公示,蓝天、朱洁静等15名演员入选