vue实现元素穿梭
Vue 实现元素穿梭功能
元素穿梭(Transfer)是常见的前端交互功能,通常用于左右两栏之间移动选项。以下是基于 Vue 的实现方法:
基础组件结构
使用两个列表(左侧源列表和右侧目标列表)以及操作按钮实现:
<template>
<div class="transfer-container">
<div class="list-container">
<h3>源列表</h3>
<ul>
<li v-for="item in leftList" :key="item.id">
<input type="checkbox" v-model="item.checked">
{{ item.label }}
</li>
</ul>
</div>
<div class="action-buttons">
<button @click="moveToRight">→</button>
<button @click="moveToLeft">←</button>
</div>
<div class="list-container">
<h3>目标列表</h3>
<ul>
<li v-for="item in rightList" :key="item.id">
<input type="checkbox" v-model="item.checked">
{{ item.label }}
</li>
</ul>
</div>
</div>
</template>
核心逻辑实现
数据结构和操作方法:
<script>
export default {
data() {
return {
leftList: [
{ id: 1, label: '选项1', checked: false },
{ id: 2, label: '选项2', checked: false },
// 更多初始数据...
],
rightList: []
}
},
methods: {
moveToRight() {
this.rightList = [
...this.rightList,
...this.leftList.filter(item => item.checked)
]
this.leftList = this.leftList.filter(item => !item.checked)
},
moveToLeft() {
this.leftList = [
...this.leftList,
...this.rightList.filter(item => item.checked)
]
this.rightList = this.rightList.filter(item => !item.checked)
}
}
}
</script>
样式优化
添加基础样式提升用户体验:
<style>
.transfer-container {
display: flex;
align-items: center;
gap: 20px;
}
.list-container {
border: 1px solid #ddd;
padding: 10px;
width: 200px;
}
ul {
list-style: none;
padding: 0;
max-height: 300px;
overflow-y: auto;
}
li {
padding: 5px 0;
border-bottom: 1px solid #eee;
}
.action-buttons {
display: flex;
flex-direction: column;
gap: 10px;
}
</style>
高级功能扩展
-
全选/反选功能:
methods: { toggleAll(list, checked) { list.forEach(item => { item.checked = checked }) } } -
拖拽支持: 通过添加
draggable属性和相关事件实现拖拽穿梭 -
搜索过滤: 添加输入框和过滤逻辑:
computed: { filteredLeftList() { return this.leftList.filter(item => item.label.includes(this.searchLeft) ) } }
组件化建议
对于复杂项目,可将穿梭框拆分为独立组件:
<transfer-box
:source="leftList"
:target="rightList"
@transfer="handleTransfer"
/>
这种实现方式提供了基础穿梭功能,可根据实际需求进一步扩展和完善。







