当前位置:首页 > 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 实现思路 核心是数据劫持结合发布-订阅模式,通过 Object.defineProperty 或 Proxy 监听数据变化,触发视图更新。 数据劫持实现 class Observer…

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…

vue实现主题

vue实现主题

Vue 实现主题的方法 使用 CSS 变量动态切换主题 定义全局 CSS 变量,通过修改这些变量实现主题切换。在 Vue 的根组件或全局样式中定义变量: :root { --primary-co…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…