当前位置:首页 > VUE

vue实现穿梭框

2026-01-08 05:25:24VUE

Vue 穿梭框实现方法

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

基础结构搭建

创建两个列表容器和一个操作按钮区域,使用v-model绑定数据源。

vue实现穿梭框

<template>
  <div class="transfer-container">
    <div class="list left-list">
      <h3>可选列表</h3>
      <ul>
        <li v-for="item in leftItems" :key="item.id">
          <input type="checkbox" v-model="selectedLeft" :value="item.id">
          {{ item.label }}
        </li>
      </ul>
    </div>

    <div class="operation-buttons">
      <button @click="moveToRight">>></button>
      <button @click="moveToLeft"><<</button>
    </div>

    <div class="list right-list">
      <h3>已选列表</h3>
      <ul>
        <li v-for="item in rightItems" :key="item.id">
          <input type="checkbox" v-model="selectedRight" :value="item.id">
          {{ item.label }}
        </li>
      </ul>
    </div>
  </div>
</template>

数据与逻辑处理

初始化数据并实现移动逻辑,通过计算属性过滤已选和未选项。

<script>
export default {
  data() {
    return {
      allItems: [
        { id: 1, label: '选项1' },
        { id: 2, label: '选项2' },
        { id: 3, label: '选项3' },
        { id: 4, label: '选项4' }
      ],
      selectedLeft: [],
      selectedRight: []
    }
  },
  computed: {
    leftItems() {
      return this.allItems.filter(item => !this.selectedRight.includes(item.id))
    },
    rightItems() {
      return this.allItems.filter(item => this.selectedRight.includes(item.id))
    }
  },
  methods: {
    moveToRight() {
      this.selectedRight = [...this.selectedRight, ...this.selectedLeft]
      this.selectedLeft = []
    },
    moveToLeft() {
      this.selectedRight = this.selectedRight.filter(id => !this.selectedLeft.includes(id))
      this.selectedLeft = []
    }
  }
}
</script>

样式优化

添加基础样式提升用户体验,包括列表布局和按钮交互效果。

vue实现穿梭框

<style>
.transfer-container {
  display: flex;
  gap: 20px;
}
.list {
  border: 1px solid #ddd;
  width: 200px;
  height: 300px;
  overflow-y: auto;
}
.operation-buttons {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
button {
  margin: 5px;
  padding: 8px 12px;
}
ul {
  list-style: none;
  padding: 0;
}
li {
  padding: 8px;
  border-bottom: 1px solid #eee;
}
</style>

高级功能扩展

增加搜索过滤和全选功能,提升组件实用性。

<!-- 在列表部分添加搜索框 -->
<div class="list left-list">
  <h3>可选列表</h3>
  <input v-model="leftFilter" placeholder="搜索...">
  <button @click="selectAllLeft">全选</button>
  <ul>
    <li v-for="item in filteredLeftItems" :key="item.id">
      <input type="checkbox" v-model="selectedLeft" :value="item.id">
      {{ item.label }}
    </li>
  </ul>
</div>
// 新增数据和方法
data() {
  return {
    leftFilter: '',
    rightFilter: ''
  }
},
computed: {
  filteredLeftItems() {
    return this.leftItems.filter(item => 
      item.label.toLowerCase().includes(this.leftFilter.toLowerCase())
    )
  }
},
methods: {
  selectAllLeft() {
    this.selectedLeft = this.filteredLeftItems.map(item => item.id)
  }
}

组件封装建议

将穿梭框封装为独立组件,通过props接收数据源,通过emit触发变化事件。

props: {
  data: {
    type: Array,
    required: true
  }
},
emits: ['change'],
methods: {
  handleMoveToRight() {
    this.moveToRight()
    this.$emit('change', this.selectedRight)
  }
}

以上实现提供了基础穿梭框功能,可根据实际需求进一步扩展如拖拽排序、自定义渲染等高级特性。

标签: vue
分享给朋友:

相关文章

vue 表格实现

vue 表格实现

Vue 表格实现方法 在 Vue 中实现表格功能可以通过多种方式完成,以下介绍几种常见的方法: 使用原生 HTML 表格 最简单的表格可以通过 Vue 模板中的原生 HTML 表格元素实现: &l…

vue实现滑动

vue实现滑动

Vue 实现滑动效果 使用 CSS 过渡和动画 通过 Vue 的 transition 组件结合 CSS 过渡或动画实现滑动效果。适用于简单的元素入场/离场滑动。 <template>…

vue实现分支

vue实现分支

Vue 实现分支的方法 在 Vue 项目中实现分支功能通常涉及条件渲染、动态组件或路由控制。以下是几种常见的实现方式: 条件渲染(v-if/v-show) 使用 Vue 的指令根据条件显示不同内容…

vue实现年历

vue实现年历

Vue 实现年历的方法 使用 Vue 实现年历可以通过组件化开发方式,结合日期计算和动态渲染完成。以下是两种常见的实现方式: 基于原生 Vue 的日历组件 创建 Calendar.vue 组件文件…

vue实现多级表头

vue实现多级表头

Vue 实现多级表头的方法 使用 el-table 组件 Element UI 的 el-table 组件支持多级表头的实现,通过嵌套 el-table-column 即可完成。 <el-ta…

vue实现购物按钮

vue实现购物按钮

Vue 购物按钮实现方法 基础按钮实现 使用 Vue 的模板语法创建基础按钮组件,绑定点击事件处理购物逻辑: <template> <button @click="addToC…