当前位置:首页 > VUE

vue穿梭框怎么实现

2026-02-22 01:35:27VUE

Vue 穿梭框实现方法

使用 Element UI 的 Transfer 组件

Element UI 提供了现成的穿梭框(Transfer)组件,适合快速集成到 Vue 项目中。安装 Element UI 后,直接引入组件即可:

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

<script>
export default {
  data() {
    return {
      sourceData: [
        { key: 1, label: 'Option 1' },
        { key: 2, label: 'Option 2' }
      ],
      selectedData: []
    }
  },
  methods: {
    handleChange(value, direction, movedKeys) {
      console.log(value, direction, movedKeys);
    }
  }
}
</script>

自定义实现基础穿梭框

如果需要完全自定义功能,可以通过以下方式实现:

<template>
  <div class="transfer-container">
    <div class="list">
      <div v-for="item in leftList" :key="item.id">
        <input type="checkbox" v-model="item.checked">
        {{ item.name }}
      </div>
    </div>
    <div class="buttons">
      <button @click="moveRight">></button>
      <button @click="moveLeft"><</button>
    </div>
    <div class="list">
      <div v-for="item in rightList" :key="item.id">
        <input type="checkbox" v-model="item.checked">
        {{ item.name }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      leftList: [
        { id: 1, name: 'Item 1', checked: false },
        { id: 2, name: 'Item 2', checked: false }
      ],
      rightList: []
    }
  },
  methods: {
    moveRight() {
      this.leftList.forEach(item => {
        if (item.checked) {
          this.rightList.push({...item, checked: false});
        }
      });
      this.leftList = this.leftList.filter(item => !item.checked);
    },
    moveLeft() {
      this.rightList.forEach(item => {
        if (item.checked) {
          this.leftList.push({...item, checked: false});
        }
      });
      this.rightList = this.rightList.filter(item => !item.checked);
    }
  }
}
</script>

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

使用第三方库 vue-transfer-dom

对于更复杂的需求,可以考虑专门的开源库如 vue-transfer-dom

  1. 安装依赖:

    npm install vue-transfer-dom
  2. 在组件中使用:

    
    <template>
    <transfer-dom
     :left-data="leftData"
     :right-data="rightData"
     @transfer-to-right="handleToRight"
     @transfer-to-left="handleToLeft">
    </transfer-dom>
    </template>
import TransferDom from 'vue-transfer-dom';

export default { components: { TransferDom }, data() { return { leftData: ['Item 1', 'Item 2'], rightData: [] } }, methods: { handleToRight(items) { this.rightData = [...this.rightData, ...items]; this.leftData = this.leftData.filter(item => !items.includes(item)); }, handleToLeft(items) { this.leftData = [...this.leftData, ...items]; this.rightData = this.rightData.filter(item => !items.includes(item)); } } }

```

关键功能扩展

对于实际项目,通常需要扩展以下功能:

vue穿梭框怎么实现

  • 添加全选/反选功能
  • 支持搜索过滤
  • 自定义渲染选项内容
  • 拖拽排序支持
  • 异步加载数据

Element UI 的 Transfer 组件已内置部分功能,自定义实现时需根据需求逐步完善。性能优化方面,对于大数据量建议使用虚拟滚动技术。

标签: vue
分享给朋友:

相关文章

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 win…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…

vue实现gps

vue实现gps

Vue 中实现 GPS 定位功能 在 Vue 中实现 GPS 定位功能通常依赖于浏览器的 Geolocation API 或第三方地图服务(如高德、百度地图等)。以下是两种常见的实现方式: 使用浏览…

vue cli 实现

vue cli 实现

Vue CLI 实现步骤 安装 Vue CLI 确保 Node.js 版本在 8.9 或以上。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 创建新项目 使…