vue 穿梭框实现
Vue 穿梭框实现方法
穿梭框(Transfer)是一种常见的前端组件,用于在两个列表之间移动数据项。以下是几种实现 Vue 穿梭框的方法:
使用 Element UI 的 Transfer 组件
Element UI 提供了现成的穿梭框组件,可以直接使用:
<template>
<el-transfer
v-model="selectedItems"
:data="items"
:titles="['Source', 'Target']"
@change="handleChange"
></el-transfer>
</template>
<script>
export default {
data() {
return {
items: [
{ key: 1, label: 'Item 1' },
{ key: 2, label: 'Item 2' },
{ key: 3, label: 'Item 3' }
],
selectedItems: []
}
},
methods: {
handleChange(value, direction, movedKeys) {
console.log(value, direction, movedKeys)
}
}
}
</script>
自定义实现穿梭框
如果需要自定义样式或功能,可以手动实现:
<template>
<div class="transfer-container">
<div class="list left-list">
<h3>Available Items</h3>
<ul>
<li v-for="item in leftItems" :key="item.id">
<input type="checkbox" v-model="selectedLeft" :value="item.id">
{{ item.name }}
</li>
</ul>
</div>
<div class="transfer-buttons">
<button @click="moveToRight">→</button>
<button @click="moveToLeft">←</button>
</div>
<div class="list right-list">
<h3>Selected Items</h3>
<ul>
<li v-for="item in rightItems" :key="item.id">
<input type="checkbox" v-model="selectedRight" :value="item.id">
{{ item.name }}
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {
leftItems: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
],
rightItems: [],
selectedLeft: [],
selectedRight: []
}
},
methods: {
moveToRight() {
const itemsToMove = this.leftItems.filter(item =>
this.selectedLeft.includes(item.id)
)
this.rightItems = [...this.rightItems, ...itemsToMove]
this.leftItems = this.leftItems.filter(item =>
!this.selectedLeft.includes(item.id)
)
this.selectedLeft = []
},
moveToLeft() {
const itemsToMove = this.rightItems.filter(item =>
this.selectedRight.includes(item.id)
)
this.leftItems = [...this.leftItems, ...itemsToMove]
this.rightItems = this.rightItems.filter(item =>
!this.selectedRight.includes(item.id)
)
this.selectedRight = []
}
}
}
</script>
<style>
.transfer-container {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
}
.list {
width: 200px;
border: 1px solid #ddd;
padding: 10px;
height: 300px;
overflow-y: auto;
}
.transfer-buttons {
display: flex;
flex-direction: column;
gap: 10px;
}
</style>
使用第三方库
除了 Element UI,还有其他 Vue 组件库提供穿梭框实现:
- Ant Design Vue 的 Transfer 组件
- Vuetify 的 v-transfer 组件
- Vue Transfer 独立库
功能增强建议
基础穿梭框可以扩展以下功能:
- 搜索过滤功能
- 拖拽排序
- 全选/全不选
- 自定义渲染内容
- 异步数据加载
- 多级穿梭框
实现时需要考虑性能优化,特别是处理大量数据时,可以使用虚拟滚动等技术。







