当前位置: 首页 > 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>
http://www.xdnf.cn/news/546211.html

相关文章:

  • Windows 安装Anaconda
  • 2025年电工杯新规发布-近三年题目以及命题趋势
  • 瀚高数据库安全版审计查询方法
  • vue3前端后端地址可配置方案
  • Spark大数据分析案例(pycharm)
  • Rocketmq broker 是主从架构还是集群架构,可以故障自动转移吗
  • 深度解析 HDFS与Hive的关系
  • C#中使用SharpSvn和TortoiseSVN操作SVN版本控制系统的完整指南
  • FreeSWITCH 纯内网配置
  • 实现图片自动压缩算法,canvas压缩图片方法
  • Java 单元测试框架比较:JUnit、TestNG 哪个更适合你?
  • pycharm无法正常调试问题
  • 【蓝桥杯真题精讲】第 16 届 Python A 组(省赛)
  • 使用 GitHub Pages 部署单页面应用教程
  • ISCC 2025决赛 wp
  • 《深入解析 Django ORM 复杂查询优化:如何提升 SQL 执行效率》
  • 多通道振弦式数据采集仪MCU安装指南
  • SymPy | 获取表达式自由变量方法与因式分解
  • 王树森推荐系统公开课 排序04:视频播放建模
  • 代码随想录算法训练营第60期第四十二天打卡
  • 多类型RFID电子标签定制 助力行业精准化管理
  • Matplotlib imsave() 方法详解
  • 使用 ARCore 和 Kotlin 开发 Android 增强现实应用入门指南
  • STM32之定时器
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核
  • vscode 常用调试
  • 进程间通信(IPC): POSIX 消息队列
  • 【解决】SSH 远程失败之路由配置问题
  • CNBC专访CertiK联创顾荣辉:从形式化验证到AI赋能,持续拓展Web3.0信任边界
  • 2025 高级 Java 面试宝典 [特殊字符](先放题目后放答案)