当前位置:首页 > VUE

vue自己实现穿梭框

2026-01-21 10:29:38VUE

实现 Vue 穿梭框的核心逻辑

穿梭框(Transfer)的核心功能是左右两侧列表数据的双向选择与移动。以下是关键实现步骤:

数据结构设计

定义左右两侧的数据源和已选数据:

data() {
  return {
    leftData: [],       // 左侧源数据
    rightData: [],      // 右侧源数据
    leftSelected: [],   // 左侧选中项
    rightSelected: []   // 右侧选中项
  }
}

渲染左右列表

使用 v-for 渲染可选项,绑定选中状态:

<div class="transfer-left">
  <h4>可选列表</h4>
  <ul>
    <li v-for="item in leftData" 
        @click="toggleSelection(item, 'left')"
        :class="{selected: leftSelected.includes(item)}">
      {{ item.label }}
    </li>
  </ul>
</div>

选择项逻辑

实现单项/全选切换:

methods: {
  toggleSelection(item, side) {
    const selected = side === 'left' ? 'leftSelected' : 'rightSelected'
    const index = this[selected].indexOf(item)
    index === -1 
      ? this[selected].push(item)
      : this[selected].splice(index, 1)
  }
}

移动按钮逻辑

实现左右移动功能:

transferItems(direction) {
  if (direction === 'right') {
    this.rightData = [...this.rightData, ...this.leftSelected]
    this.leftData = this.leftData.filter(x => !this.leftSelected.includes(x))
    this.leftSelected = []
  } else {
    this.leftData = [...this.leftData, ...this.rightSelected]
    this.rightData = this.rightData.filter(x => !this.rightSelected.includes(x))
    this.rightSelected = []
  }
}

全选/清空功能

添加批量操作按钮:

vue自己实现穿梭框

selectAll(side) {
  this[`${side}Selected`] = [...this[`${side}Data`]]
},

clearAll(side) {
  this[`${side}Selected`] = []
}

样式优化关键点

  • 使用 flex 布局实现左右分栏
  • 高亮显示选中项样式
    .selected {
    background-color: #f0f7ff;
    border-left: 3px solid #1890ff;
    }

完整组件示例

<template>
  <div class="transfer-container">
    <transfer-panel 
      :data="leftData" 
      :selected="leftSelected"
      @select="toggleSelection($event, 'left')"
      @select-all="selectAll('left')"/>

    <div class="transfer-buttons">
      <button @click="transferItems('right')">→</button>
      <button @click="transferItems('left')">←</button>
    </div>

    <transfer-panel
      :data="rightData"
      :selected="rightSelected"
      @select="toggleSelection($event, 'right')"
      @select-all="selectAll('right')"/>
  </div>
</template>

性能优化建议

  1. 大数据量时采用虚拟滚动
  2. 使用 key 属性优化列表渲染
  3. 复杂数据场景考虑用 provide/inject 管理状态

实现时可根据需求扩展搜索过滤、拖拽排序等高级功能。

标签: vue
分享给朋友:

相关文章

vue实现横向导航

vue实现横向导航

vue实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(Vu…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

vue实现driver

vue实现driver

Vue 实现 Driver.js 引导功能 Driver.js 是一个轻量级的 JavaScript 库,用于在网页上创建引导式导览。以下是在 Vue 项目中集成 Driver.js 的详细方法:…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…