当前位置:首页 > VUE

vue穿梭框组件实现

2026-01-12 05:19:51VUE

实现 Vue 穿梭框组件的基本思路

穿梭框(Transfer)组件通常用于在两个列表之间移动数据项。核心功能包括左侧列表、右侧列表、移动按钮(左移、右移、全选等)以及数据项的渲染与交互。

基础结构设计

创建 Transfer.vue 文件,定义组件的基本结构:

<template>
  <div class="transfer-container">
    <div class="transfer-list left-list">
      <h3>左侧列表</h3>
      <ul>
        <li v-for="item in leftItems" :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-list right-list">
      <h3>右侧列表</h3>
      <ul>
        <li v-for="item in rightItems" :key="item.id">
          <input type="checkbox" v-model="item.checked" />
          {{ item.label }}
        </li>
      </ul>
    </div>
  </div>
</template>

数据模型与逻辑

定义组件的数据模型和核心方法:

<script>
export default {
  props: {
    data: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      leftItems: [],
      rightItems: [],
    };
  },
  methods: {
    moveToRight() {
      const selectedItems = this.leftItems.filter((item) => item.checked);
      this.rightItems = [...this.rightItems, ...selectedItems];
      this.leftItems = this.leftItems.filter((item) => !item.checked);
    },
    moveToLeft() {
      const selectedItems = this.rightItems.filter((item) => item.checked);
      this.leftItems = [...this.leftItems, ...selectedItems];
      this.rightItems = this.rightItems.filter((item) => !item.checked);
    },
  },
  created() {
    this.leftItems = this.data.map((item) => ({
      ...item,
      checked: false,
    }));
  },
};
</script>

样式优化

添加基础样式增强交互体验:

<style scoped>
.transfer-container {
  display: flex;
  align-items: center;
  gap: 20px;
}

.transfer-list {
  border: 1px solid #ddd;
  width: 200px;
  height: 300px;
  overflow-y: auto;
  padding: 10px;
}

.transfer-buttons {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

ul {
  list-style: none;
  padding: 0;
}

li {
  padding: 5px;
  cursor: pointer;
}

li:hover {
  background-color: #f5f5f5;
}
</style>

功能扩展

  1. 全选/反选功能
    添加全选按钮,快速选择所有项目:
methods: {
  toggleAllLeft(selectAll) {
    this.leftItems.forEach(item => {
      item.checked = selectAll;
    });
  },
  toggleAllRight(selectAll) {
    this.rightItems.forEach(item => {
      item.checked = selectAll;
    });
  },
}
  1. 搜索过滤
    增加搜索框过滤列表项:
<div class="transfer-list left-list">
  <input v-model="leftSearch" placeholder="搜索..." />
  <ul>
    <li v-for="item in filteredLeftItems" :key="item.id">
      <!-- 省略 -->
    </li>
  </ul>
</div>
computed: {
  filteredLeftItems() {
    return this.leftItems.filter(item =>
      item.label.includes(this.leftSearch)
    );
  },
}
  1. 拖拽支持
    通过 draggable 属性实现拖拽移动:
<li
  draggable="true"
  @dragstart="handleDragStart(item, 'left')"
  @drop="handleDrop('right')"
  @dragover.prevent
>
  <!-- 省略 -->
</li>

使用示例

在父组件中调用:

<Transfer :data="[
  { id: 1, label: '选项1' },
  { id: 2, label: '选项2' },
  { id: 3, label: '选项3' },
]" />

注意事项

  • 数据项需包含唯一标识(如 id)和显示文本(如 label)。
  • 可通过插槽(slot)自定义列表项的渲染方式。
  • 对于大量数据,建议使用虚拟滚动优化性能。

vue穿梭框组件实现

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

相关文章

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue实现摘要

vue实现摘要

Vue 实现摘要的方法 在 Vue 中实现文本摘要功能通常涉及截取文本的前部分内容并添加省略号。可以通过计算属性、过滤器或自定义指令来实现。 计算属性实现 在 Vue 组件中定义一个计算属性,用于截…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{…