当前位置:首页 > VUE

vue实现左右多选框

2026-02-21 11:13:25VUE

Vue 实现左右多选框组件

左右多选框(Transfer)是常见的表单组件,用于在两个列表之间移动选项。以下是基于 Vue 2/3 的实现方法:

基础组件结构

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

    <div class="transfer-actions">
      <button @click="moveToRight">→</button>
      <button @click="moveToLeft">←</button>
    </div>

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

核心逻辑实现

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

样式优化

<style scoped>
.transfer-container {
  display: flex;
  align-items: center;
  gap: 20px;
}
.transfer-panel {
  border: 1px solid #ddd;
  width: 200px;
  height: 300px;
  overflow-y: auto;
}
.transfer-actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
ul {
  list-style: none;
  padding: 0;
}
li {
  padding: 8px;
  border-bottom: 1px solid #eee;
}
</style>

进阶功能实现

双向绑定支持

vue实现左右多选框

props: {
  value: {
    type: Array,
    default: () => []
  }
},
watch: {
  value(newVal) {
    this.rightItems = newVal
    this.leftItems = this.allItems.filter(item => 
      !newVal.some(v => v.value === item.value)
    )
  },
  rightItems: {
    handler(newVal) {
      this.$emit('input', newVal)
    },
    deep: true
  }
}

全选功能

methods: {
  selectAllLeft() {
    this.selectedLeft = this.leftItems.map(item => item.value)
  },
  selectAllRight() {
    this.selectedRight = this.rightItems.map(item => item.value)
  }
}

搜索过滤

vue实现左右多选框

<input v-model="leftFilter" placeholder="搜索">
<ul>
  <li v-for="item in filteredLeftItems" :key="item.value">
    <!-- 选项内容 -->
  </li>
</ul>
computed: {
  filteredLeftItems() {
    return this.leftItems.filter(item => 
      item.label.includes(this.leftFilter)
    )
  }
}

使用第三方库

对于生产环境,推荐使用成熟的组件库:

  • Element UI 的 el-transfer
  • Ant Design Vue 的 a-transfer
  • Vuetify 的 v-combobox 配合多选模式

这些库提供了更完善的API和样式,例如:

<el-transfer
  v-model="value"
  :data="data"
  :titles="['Source', 'Target']"
></el-transfer>

实现时需注意性能优化,特别是大数据量场景下应考虑虚拟滚动、分页加载等技术方案。

标签: 多选vue
分享给朋友:

相关文章

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue 实现聊天

vue 实现聊天

使用 Vue 实现聊天功能 创建 Vue 项目并安装依赖 确保已安装 Vue CLI,通过以下命令创建新项目: vue create chat-app 进入项目目录后,安装必要的依赖(如 Socke…

vue实现treetable

vue实现treetable

Vue实现TreeTable的方法 使用第三方组件库(如Element UI) Element UI的el-table组件支持树形表格展示,通过设置row-key和tree-props属性即可实现。…

vue  实现分页

vue 实现分页

实现分页的基本思路 在Vue中实现分页通常需要结合后端API返回的数据和前端的分页组件。分页的核心逻辑包括计算总页数、处理当前页码变化以及触发数据请求。 分页组件示例 使用Element UI的分页…

vue实现右滑

vue实现右滑

Vue 实现右滑功能 右滑功能通常用于移动端应用,实现手势操作。以下是几种常见的实现方法: 使用 Hammer.js 库 Hammer.js 是一个专门处理手势的库,可以方便地实现右滑功能。 im…