当前位置:首页 > 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>

自定义穿梭框组件

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

<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. 搜索过滤:在面板顶部添加搜索框,过滤显示项

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

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

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

    vue穿梭框组件实现

性能优化建议

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

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

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

相关文章

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Desi…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…

vue实现导入

vue实现导入

Vue 实现文件导入功能 使用 <input type="file"> 元素 在 Vue 模板中添加一个文件输入元素,绑定 change 事件处理函数。 <template>…

vue 实现平面

vue 实现平面

Vue 实现平面的方法 在 Vue 中实现平面效果通常涉及 CSS 样式、UI 框架或自定义组件的使用。以下是几种常见方法: 使用 CSS 样式 通过 Vue 的样式绑定或 scoped CSS 为…

vue实现 页面

vue实现 页面

Vue 实现页面的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 是官方脚手架工具,适合传统项目;Vite 提供更快的现代构建体验。 npm cre…