当前位置:首页 > VUE

vue穿梭框实现

2026-01-15 06:15:14VUE

Vue 穿梭框实现方法

使用 Element UI 的 Transfer 组件

Element UI 提供了现成的 Transfer 穿梭框组件,适用于 Vue 2.x 项目。安装 Element UI 后可直接使用:

npm install element-ui

基础用法示例:

vue穿梭框实现

<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>

使用 Ant Design Vue 的 Transfer 组件

对于 Vue 3.x 项目,Ant Design Vue 提供了兼容的 Transfer 组件:

vue穿梭框实现

npm install ant-design-vue@next

基础实现代码:

<template>
  <a-transfer
    v-model:target-keys="targetKeys"
    :data-source="mockData"
    :render="item => item.title"
    @change="handleChange"
  />
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    const mockData = Array.from({ length: 20 }).map((_, i) => ({
      key: i.toString(),
      title: `content${i + 1}`,
      description: `description of content${i + 1}`,
    }))

    const targetKeys = ref([])

    const handleChange = (nextTargetKeys, direction, moveKeys) => {
      console.log('targetKeys:', nextTargetKeys)
      console.log('direction:', direction)
      console.log('moveKeys:', moveKeys)
    }

    return {
      mockData,
      targetKeys,
      handleChange
    }
  }
}
</script>

自定义实现穿梭框

如果需要完全自定义的穿梭框,可以通过以下方式实现核心功能:

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

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

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

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

<style>
.transfer-container {
  display: flex;
  justify-content: space-between;
}
.source-panel, .target-panel {
  width: 45%;
  border: 1px solid #ddd;
  padding: 10px;
}
.transfer-buttons {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
</style>

功能增强建议

  1. 添加搜索过滤功能,在大型数据集时提高可用性
  2. 实现全选/取消全选功能
  3. 添加拖拽排序支持
  4. 自定义每项的渲染模板
  5. 添加分页功能处理大量数据

以上方法可根据项目需求选择使用现成组件或自定义实现,Element UI 和 Ant Design Vue 的组件已经包含丰富功能,适合快速开发。自定义实现则提供更高灵活性,适合特殊需求场景。

标签: vue
分享给朋友:

相关文章

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。例…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…