基于elementUI封装的带复选框el-checkbox的下拉多选el-select组件

效果图:

组件:MultipleSelect.vue

javascript 复制代码
<template>
  <el-select v-model="selectValues" v-bind="$attrs" v-on="listeners" multiple placeholder="请选择" style="width: 50%" @change="changeSelect">
    <el-option v-if="options.length" label="全选" value="全选">
      <el-checkbox v-model="isSelectAll" @click.prevent.native>全选</el-checkbox>
    </el-option>
    <el-option v-for="item in options" :key="item[props.value]" :label="item[props.label]" :value="item[props.value]">
      <el-checkbox v-model="item.isCheck" @click.prevent.native>{{item[props.label]}}</el-checkbox>
    </el-option>
  </el-select>
</template>
 
<script>
export default {
  name: "MultipleSelect",
  inheritAttrs: false,// 似乎设不设置都可以
  model: {
    prop: "initSelectValues",
    event: "change"
  },
  props: {
    initSelectValues: {
      type: Array,
      default: () => []
    },
    // 下拉选项
    options: {
      type: Array,
      default: () => []
    },
    // 选项键值对
    props: {
      type: Object,
      default: () => {
        return {
          label: "label",
          value: "value"
        }
      }
    }
  },
  data() {
    return {
      selectValues: [],
      isSelectAll: false
    }
  },
  watch: {
    // 监听(全选,全不选以及checkbox是否勾选)
    selectValues: {
      handler(arr) {
        this.options.forEach(item => {
          if (arr.includes(item[this.props.value])) {
            item.isCheck = true
          } else {
            item.isCheck = false
          }
        })
 
        if (arr.length === this.options.length) {
          this.isSelectAll = true
        } else {
          this.isSelectAll = false
        }
        // 强制更新(checkbox回显)
        this.$forceUpdate()
      }
    }
  },
  created() {
    // 回显
    this.selectValues = this.initSelectValues
  },
  methods: {
    changeSelect(val) {
      if (val.includes("全选")) {
        // 说明已经全选了,所以全不选
        if (val.length > this.options.length) {
          this.selectValues = []
        } else {
          this.selectValues = this.options.map(item => item[this.props.value])
        }
      }
      this.$emit("change", this.selectValues)
    }
  }
}
</script>
 
<style>
</style>

使用:index.vue

javascript 复制代码
<template>
  <div id="app">
    <MultipleSelect v-model="value" :options="options"></MultipleSelect>
    <el-button @click="confirm">确定</el-button>
  </div>
</template>

<script>
import MultipleSelect from "./components/MultipleSelect"
export default {
  name: 'App',
  components: {
    MultipleSelect
  },
  data() {
    return {
      value: [],
      options: [
        {
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }
      ]
    }
  },
  methods: {
    confirm() {
      console.log("value", this.value)
    }
  }
}
</script>

<style>

</style>

多选框多选不换行

css 复制代码
 /* 输入框超出隐藏,不换行*/
  .el-select__tags {
    flex-wrap: nowrap;
    overflow: auto;
  }

  /* 输入框最大宽度*/
   .el-select__tags-text {
    max-width: 90px;
  }
相关推荐
高级程序源12 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
WeiXin_DZbishe13 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
架构技术专栏13 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海14 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
志尊宝15 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
WeiXin_DZbishe15 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
刘发财15 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
WeiXin_DZbishe15 小时前
基于Springboot+AI的kuall音乐广场的设计与实现-计算机毕设 附源码【课程设计】12715
vue.js·人工智能·spring boot·后端·python·php·课程设计
A接拉起00716 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
_馒头16 小时前
pixiJs游戏开发实践 - 跳棋小游戏
javascript·vue.js