当前位置:首页 > VUE

vue自己实现穿梭框

2026-01-21 10:29:38VUE

实现 Vue 穿梭框的核心逻辑

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

数据结构设计

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

vue自己实现穿梭框

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>

选择项逻辑

实现单项/全选切换:

vue自己实现穿梭框

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 = []
  }
}

全选/清空功能

添加批量操作按钮:

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中手动实现弹窗组件,需要创建一个独立的弹窗组件,并通过props控制其显示与隐藏。弹窗组件通常包含遮罩层、内容区域和关闭按钮。 <template>…

vue实现横向导航

vue实现横向导航

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

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-contain…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用X…