当前位置:首页 > 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>

进阶功能实现

双向绑定支持

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)
  }
}

搜索过滤

<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实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-li…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…