当前位置:首页 > VUE

vue穿梭框组件实现

2026-02-09 18:20:36VUE

Vue 穿梭框组件实现

使用 Element UI 的 Transfer 组件

Element UI 提供了一个现成的穿梭框组件 el-transfer,适合快速实现需求。

安装 Element UI:

npm install element-ui

基础用法示例:

<template>
  <el-transfer
    v-model="selectedData"
    :data="sourceData"
    :titles="['Source', 'Target']"
    @change="handleChange">
  </el-transfer>
</template>

<script>
export default {
  data() {
    return {
      sourceData: [],
      selectedData: []
    }
  },
  created() {
    // 模拟数据
    for (let i = 1; i <= 15; i++) {
      this.sourceData.push({
        key: i,
        label: `Option ${i}`,
        disabled: i % 4 === 0
      })
    }
  },
  methods: {
    handleChange(value, direction, movedKeys) {
      console.log(value, direction, movedKeys)
    }
  }
}
</script>

自定义穿梭框组件

如果需要完全自定义功能,可以手动实现:

vue穿梭框组件实现

<template>
  <div class="custom-transfer">
    <div class="transfer-panel">
      <h3>Source</h3>
      <ul>
        <li v-for="item in leftData" :key="item.id">
          <input type="checkbox" v-model="item.checked">
          {{ item.label }}
        </li>
      </ul>
    </div>

    <div class="transfer-buttons">
      <button @click="moveToRight">→</button>
      <button @click="moveToLeft">←</button>
    </div>

    <div class="transfer-panel">
      <h3>Target</h3>
      <ul>
        <li v-for="item in rightData" :key="item.id">
          <input type="checkbox" v-model="item.checked">
          {{ item.label }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      leftData: [
        { id: 1, label: 'Item 1', checked: false },
        { id: 2, label: 'Item 2', checked: false }
      ],
      rightData: []
    }
  },
  methods: {
    moveToRight() {
      const selected = this.leftData.filter(item => item.checked)
      this.rightData = [...this.rightData, ...selected]
      this.leftData = this.leftData.filter(item => !item.checked)
    },
    moveToLeft() {
      const selected = this.rightData.filter(item => item.checked)
      this.leftData = [...this.leftData, ...selected]
      this.rightData = this.rightData.filter(item => !item.checked)
    }
  }
}
</script>

<style>
.custom-transfer {
  display: flex;
  justify-content: space-between;
}
.transfer-panel {
  width: 200px;
  border: 1px solid #ddd;
  padding: 10px;
}
.transfer-buttons {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
</style>

高级功能扩展

对于更复杂的需求,可以考虑以下增强功能:

  1. 搜索过滤:在面板顶部添加搜索框,过滤显示项

    vue穿梭框组件实现

    <input v-model="searchQuery" placeholder="Search...">
  2. 全选/反选:添加全选按钮控制所有选项

    <button @click="toggleAll">Toggle All</button>
  3. 拖拽排序:使用 vuedraggable 实现拖拽功能

    npm install vuedraggable
  4. 分页显示:大数据量时分页处理

性能优化建议

  • 对于大数据量(1000+项),使用虚拟滚动技术
  • 使用 Object.freeze() 冻结静态数据提高性能
  • 避免在 v-for 中使用复杂计算

以上方案可根据实际项目需求选择使用现成组件或自定义实现,Element UI 的 Transfer 组件适合大多数标准场景,而自定义实现则提供了完全的灵活性。

标签: 组件vue
分享给朋友:

相关文章

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API metho…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue实现treeview

vue实现treeview

Vue 实现 TreeView 的方法 使用递归组件实现 TreeView 递归组件是 Vue 中实现 TreeView 的常见方式。通过组件调用自身,可以轻松处理嵌套的树形结构数据。 <te…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…