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

Vue3 + Element Plus Transfer 穿梭框自定义分组

1. 使用 render-content 自定义渲染

<template><el-transferv-model="selectedData":data="groupedData":render-content="renderFunc":titles="['可选数据', '已选数据']"/>
</template><script setup>
import { ref } from 'vue';const selectedData = ref([]);// 分组数据格式
const groupedData = ref([{key: 'group1',label: '第一组',disabled: false,children: [{ key: '1', label: '选项1' },{ key: '2', label: '选项2' }]},{key: 'group2',label: '第二组',disabled: false,children: [{ key: '3', label: '选项3' },{ key: '4', label: '选项4' }]}
]);// 扁平化数据供Transfer使用
const flatData = computed(() => {return groupedData.value.flatMap(group => group.children.map(item => ({key: item.key,label: item.label,disabled: item.disabled})));
});// 自定义渲染函数
const renderFunc = (h, option) => {// 这里可以自定义渲染逻辑return h('div', option.label);
};
</script>

2. 完全自定义左右面板

如果需要更复杂的分组效果,可以完全自定义左右面板:

<template><div class="custom-transfer"><div class="transfer-panel"><div class="panel-header">可选数据</div><div class="panel-body"><div v-for="group in leftGroups" :key="group.key" class="group"><div class="group-title">{{ group.label }}</div><div class="group-items"><el-checkbox v-for="item in group.children" :key="item.key"v-model="item.checked":label="item.label"@change="handleLeftChange(item)"/></div></div></div></div><div class="transfer-buttons"><el-button @click="moveToRight">→</el-button><el-button @click="moveToLeft">←</el-button></div><div class="transfer-panel"><div class="panel-header">已选数据</div><div class="panel-body"><div v-for="group in rightGroups" :key="group.key" class="group"><div class="group-title">{{ group.label }}</div><div class="group-items"><el-checkbox v-for="item in group.children" :key="item.key"v-model="item.checked":label="item.label"@change="handleRightChange(item)"/></div></div></div></div></div>
</template><script setup>
import { ref, computed } from 'vue';// 原始分组数据
const rawData = ref([{key: 'group1',label: '第一组',children: [{ key: '1', label: '选项1', checked: false },{ key: '2', label: '选项2', checked: false }]},{key: 'group2',label: '第二组',children: [{ key: '3', label: '选项3', checked: false },{ key: '4', label: '选项4', checked: false }]}
]);// 计算左侧分组数据
const leftGroups = computed(() => {return rawData.value.map(group => ({...group,children: group.children.filter(item => !selectedData.value.includes(item.key))}));
});// 计算右侧分组数据
const rightGroups = computed(() => {const selectedKeys = selectedData.value;return rawData.value.map(group => ({...group,children: group.children.filter(item => selectedKeys.includes(item.key))})).filter(group => group.children.length > 0);
});// 移动选中项到右侧
const moveToRight = () => {rawData.value.forEach(group => {group.children.forEach(item => {if (item.checked && !selectedData.value.includes(item.key)) {selectedData.value.push(item.key);item.checked = false;}});});
};// 移动选中项到左侧
const moveToLeft = () => {rawData.value.forEach(group => {group.children.forEach(item => {if (item.checked && selectedData.value.includes(item.key)) {const index = selectedData.value.indexOf(item.key);selectedData.value.splice(index, 1);item.checked = false;}});});
};
</script><style scoped>
.custom-transfer {display: flex;align-items: center;
}
.transfer-panel {width: 250px;border: 1px solid #ebeef5;border-radius: 4px;
}
.panel-header {padding: 10px;background: #f5f7fa;border-bottom: 1px solid #ebeef5;
}
.panel-body {padding: 10px;height: 300px;overflow: auto;
}
.group {margin-bottom: 15px;
}
.group-title {font-weight: bold;margin-bottom: 5px;
}
.transfer-buttons {margin: 0 10px;
}
</style>

3. 使用插槽自定义内容

Element Plus 的 Transfer 组件提供了插槽来自定义内容:

<el-transfer v-model="value" :data="data"><template #left-footer><el-button size="small">操作</el-button></template><template #right-footer><el-button size="small">操作</el-button></template>
</el-transfer>

4. 结合 Tree 组件实现树形分组

如果需要树形分组,可以结合 Tree 组件来实现:

<template><div class="tree-transfer"><div class="left-panel"><el-tree:data="treeData"show-checkboxnode-key="id"ref="leftTree"@check-change="handleCheckChange"/></div><div class="transfer-buttons"><el-button @click="moveToRight">→</el-button><el-button @click="moveToLeft">←</el-button></div><div class="right-panel"><el-tree:data="selectedTreeData"show-checkboxnode-key="id"ref="rightTree"/></div></div>
</template>

http://www.lqws.cn/news/539605.html

相关文章:

  • 【docker】构建时使用宿主机的代理
  • HarmonyOS NEXT仓颉开发语言实战案例:简约音乐播放页
  • jvm简单八股
  • model训练中python基本数据类型的保存输出
  • 爬虫006----Scrapy框架
  • 2025-6-27-C++ 学习 模拟与高精度(7)
  • Kotlin中协程挂起函数的本质
  • SpringBoot -- 整合Junit
  • 分布式session解决方案
  • 笔记:使用EasyExcel导入csv文件出现编码问题,导致导入数据全为null的解决方法
  • Apache Kafka 面试应答指南
  • 那些不应该的优化
  • html配置rem实现页面自适应
  • Linux:从后往前查看日志命令
  • 编译原理---文法和语法分析
  • 基于全局构建版本和ES模块构建版本的vue3 快速上手
  • LLM驱动开发:正在重塑软件工程的下一场革命
  • Maven生命周期与阶段扩展深度解析
  • GO 语言学习 之 语句块
  • vscode把less文件生成css文件配置,设置生成自定义文件名称和路径
  • FlutterPackages中的animations库升级适配Flutter3.27
  • Ubuntu18.04/Mysql 5.7 建立主备模式Mysql集群
  • 华为云Flexus+DeepSeek征文|Dify平台开发搭建口腔牙科24小时在线问诊系统(AI知识库系统)
  • C++学习笔记
  • 16.3 Docker生产级部署:网络与存储高效配置实战,保障99.95%可用性
  • 387. 字符串中的第一个唯一字符
  • uni-app uts 插件 android 端 科大讯飞离线语音合成最新版
  • 修改表中满足特定条件的字段值
  • elementUI轮播图组件el-carousel适配移动端大小(图片加载好后根据大小适配)
  • 抽样分布与参数估计细节