当前位置:首页 > VUE

vue实现穿梭框

2026-02-10 19:48:55VUE

Vue 实现穿梭框

穿梭框(Transfer)是一种常见的 UI 组件,用于在两个列表之间移动数据项。以下是基于 Vue 实现穿梭框的几种方法。

vue实现穿梭框

使用 Element UI 的 Transfer 组件

Element UI 提供了现成的 el-transfer 组件,可以直接使用:

vue实现穿梭框

<template>
  <el-transfer
    v-model="selectedItems"
    :data="items"
    :titles="['Source', 'Target']"
    :button-texts="['Remove', 'Add']"
  ></el-transfer>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { key: 1, label: 'Item 1' },
        { key: 2, label: 'Item 2' },
        { key: 3, label: 'Item 3' }
      ],
      selectedItems: []
    };
  }
};
</script>

自定义实现穿梭框

如果需要完全自定义,可以手动实现一个穿梭框:

<template>
  <div class="transfer-container">
    <div class="list left-list">
      <h3>Source</h3>
      <ul>
        <li v-for="item in leftItems" :key="item.key">
          <input type="checkbox" v-model="item.checked" />
          {{ item.label }}
        </li>
      </ul>
    </div>
    <div class="buttons">
      <button @click="moveToRight">>></button>
      <button @click="moveToLeft"><<</button>
    </div>
    <div class="list right-list">
      <h3>Target</h3>
      <ul>
        <li v-for="item in rightItems" :key="item.key">
          <input type="checkbox" v-model="item.checked" />
          {{ item.label }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      leftItems: [
        { key: 1, label: 'Item 1', checked: false },
        { key: 2, label: 'Item 2', checked: false },
        { key: 3, label: 'Item 3', checked: false }
      ],
      rightItems: []
    };
  },
  methods: {
    moveToRight() {
      const checkedItems = this.leftItems.filter(item => item.checked);
      this.rightItems = [...this.rightItems, ...checkedItems];
      this.leftItems = this.leftItems.filter(item => !item.checked);
    },
    moveToLeft() {
      const checkedItems = this.rightItems.filter(item => item.checked);
      this.leftItems = [...this.leftItems, ...checkedItems];
      this.rightItems = this.rightItems.filter(item => !item.checked);
    }
  }
};
</script>

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

使用 Vue Draggable 实现拖拽穿梭框

如果需要支持拖拽功能,可以使用 vuedraggable 库:

<template>
  <div class="transfer-container">
    <div class="list left-list">
      <h3>Source</h3>
      <draggable v-model="leftItems" group="items">
        <div v-for="item in leftItems" :key="item.key">
          {{ item.label }}
        </div>
      </draggable>
    </div>
    <div class="list right-list">
      <h3>Target</h3>
      <draggable v-model="rightItems" group="items">
        <div v-for="item in rightItems" :key="item.key">
          {{ item.label }}
        </div>
      </draggable>
    </div>
  </div>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  data() {
    return {
      leftItems: [
        { key: 1, label: 'Item 1' },
        { key: 2, label: 'Item 2' },
        { key: 3, label: 'Item 3' }
      ],
      rightItems: []
    };
  }
};
</script>

注意事项

  • 如果需要双向绑定,确保使用 v-model 或手动更新数据。
  • 自定义实现时,注意样式和交互逻辑的细节。
  • 使用第三方库时,确保安装并导入正确的组件。

以上方法可以根据具体需求选择,Element UI 的 el-transfer 适合快速集成,自定义实现适合高度定制化的场景。

标签: vue
分享给朋友:

相关文章

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue实现登出

vue实现登出

实现Vue登出功能 登出功能通常涉及清除用户会话、令牌或本地存储的数据,并重定向到登录页面。以下是几种常见的实现方式: 清除用户令牌和状态 在Vuex的store中定义一个logout mutati…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现频道

vue实现频道

Vue实现频道功能的方法 使用Vue Router动态路由 通过Vue Router的动态路由功能可以轻松实现频道切换。在路由配置中定义动态参数,组件内通过this.$route.params获取当前…

vue cli 实现

vue cli 实现

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

vue实现login

vue实现login

Vue 实现登录功能 在 Vue 中实现登录功能通常需要以下几个步骤: 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,包含用户名和密码输入框以及提交按钮。可以使用 Vue 的模板语法和双…