• el-select 下拉框全选、多选的几种方式组件


    组件一、基础多选

    适用性较广的基础多选,用 Tag 展示已选项

    1. <template>
    2. <el-select v-model="value1" multiple placeholder="请选择">
    3. <el-option
    4. v-for="item in options"
    5. :key="item.value"
    6. :label="item.label"
    7. :value="item.value">
    8. el-option>
    9. el-select>
    10. template>
    11. <script>
    12. export default {
    13. data() {
    14. return {
    15. options: [{
    16. value: '选项1',
    17. label: '黄金糕'
    18. }, {
    19. value: '选项2',
    20. label: '双皮奶'
    21. }, {
    22. value: '选项3',
    23. label: '蚵仔煎'
    24. }, {
    25. value: '选项4',
    26. label: '龙须面'
    27. }, {
    28. value: '选项5',
    29. label: '北京烤鸭'
    30. }],
    31. value1: []
    32. }
    33. }
    34. }
    35. script>

    el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。

    1. <template>
    2. <el-select
    3. v-model="value2"
    4. multiple
    5. collapse-tags
    6. style="margin-left: 20px;"
    7. placeholder="请选择">
    8. <el-option
    9. v-for="item in options"
    10. :key="item.value"
    11. :label="item.label"
    12. :value="item.value">
    13. el-option>
    14. el-select>
    15. template>
    16. <script>
    17. export default {
    18. data() {
    19. return {
    20. options: [{
    21. value: '选项1',
    22. label: '黄金糕'
    23. }, {
    24. value: '选项2',
    25. label: '双皮奶'
    26. }, {
    27. value: '选项3',
    28. label: '蚵仔煎'
    29. }, {
    30. value: '选项4',
    31. label: '龙须面'
    32. }, {
    33. value: '选项5',
    34. label: '北京烤鸭'
    35. }],
    36. value2: []
    37. }
    38. }
    39. }
    40. script>

     组件二、el-select 下拉框多选实现全选

    下拉项增加一个【全选】,然后应该有以下几种情况:

    1. 下拉选项全都勾选时,【全选】自动勾选;
    2. 下拉选项部分勾选时,点击【全选】后,所有下拉项全部勾选;
    3. 下拉选项全都未勾选时,点击【全选】后,所有下拉选项不勾选;
    4. 下拉选项和【全选】都选上的时候,不勾选任意下拉选项,【全选】按钮就不勾选了

    效果图一、

    上代码:

    1. export default {
    2. data() {
    3. return {
    4. selectedArray: [],
    5. options: [
    6. { name: '一一', label: 'one' },
    7. { name: '二二', label: 'tow' },
    8. { name: '三三', label: 'three' },
    9. { name: '四四', label: 'four' },
    10. { name: '五五', label: 'five' }
    11. ]
    12. }
    13. },
    14. methods: {
    15. selectAll() {
    16. if (this.selectedArray.length < this.options.length) {
    17. this.selectedArray = []
    18. this.options.map((item) => {
    19. this.selectedArray.push(item.name)
    20. })
    21. this.selectedArray.unshift('全选')
    22. } else {
    23. this.selectedArray = []
    24. }
    25. },
    26. changeSelect(val) {
    27. if (!val.includes('全选') && val.length === this.options.length) {
    28. this.selectedArray.unshift('全选')
    29. } else if (val.includes('全选') && (val.length - 1) < this.options.length) {
    30. this.selectedArray = this.selectedArray.filter((item) => {
    31. return item !== '全选'
    32. })
    33. }
    34. },
    35. removeTag(val) {
    36. if (val === '全选') {
    37. this.selectedArray = []
    38. }
    39. }
    40. }
    41. }

    效果图二、

    代码:
    直接添加一个【全选】复选框,实现的功能跟方法一是一样的
     

    1. export default {
    2. data() {
    3. return {
    4. checked: false,
    5. selectedArray: [],
    6. options: [
    7. { name: '一一', label: 'one' },
    8. { name: '二二', label: 'tow' },
    9. { name: '三三', label: 'three' },
    10. { name: '四四', label: 'four' },
    11. { name: '五五', label: 'five' }
    12. ]
    13. }
    14. },
    15. methods: {
    16. selectAll() {
    17. this.selectedArray = []
    18. if (this.checked) {
    19. this.options.map((item) => {
    20. this.selectedArray.push(item.name)
    21. })
    22. } else {
    23. this.selectedArray = []
    24. }
    25. },
    26. changeSelect(val) {
    27. if (val.length === this.options.length) {
    28. this.checked = true
    29. } else {
    30. this.checked = false
    31. }
    32. }
    33. }
    34. }
    1. .el-checkbox {
    2. text-align: right;
    3. width: 100%;
    4. padding-right: 10px;
    5. }

    效果图三、

    下拉框和全选都加上 checkbox,选择框 el-select 全选 多选, el-option与el-checkbox的组合使用

    需要注意的事项:

    1. el-select与el-checkbox-group的v-model 绑定的值,需相同,绑定同一个变量
    2. el-option的value与el-checkbox的label绑定的值也需要相同
    3. el-checkbox 需要使用 style=“pointer-events: none”, 是为了去掉鼠标事件,阻止事件冒泡,触发了两次el-select的change事件


    代码如下:

    1. v-model="lineNumStage"
    2. v-bind="$attrs"
    3. multiple
    4. style="width: 100%;"
    5. placeholder="请选择线路"
    6. @change="handleSelect"
    7. >
    8. <div style="padding: 0 20px; line-height:34px">
    9. <el-checkbox v-model="isCheckAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选el-checkbox>
    10. div>
    11. <el-checkbox-group v-model="lineNumStage">
    12. <el-option v-for="item in checkedLineArry" :key="item.value" :label="item.name" :value="item.value">
    13. <el-checkbox style="pointer-events: none" :label="item.value">
    14. {{ item.label }}
    15. el-checkbox>
    16. el-option>
    17. el-checkbox-group>
    1. checkAll: false, // 是否全选
    2. isIndeterminate: false, //全选复选框标识
    3. options: [
    4. { name: '京广高速', value: '京广高速' },
    5. { name: '京包客专', value: '京包客专' },
    6. { name: '京哈高速', value: '京哈高速' },
    7. { name: '崇礼线', value: '崇礼线' },
    8. { name: '京秦高铁', value: '京秦高铁' },
    9. { name: '京沪高铁', value: '京沪高铁' },
    10. { name: '京津城际', value: '京津城际' },
    11. ],
    12. biddingStage: [],
    13. // 下拉框选择事件
    14. handleSelect(value) {
    15. const checkedCount = value.length;
    16. this.checkAll = checkedCount === this.options.length;
    17. this.isIndeterminate = checkedCount > 0 && checkedCount < this.options.length;
    18. },
    19. // 全选事件
    20. handleCheckAllChange(val) {
    21. const data = this.options.map(item => {
    22. return item.value
    23. })
    24. this.biddingStage = val ? data : [];
    25. this.isIndeterminate = false;
    26. },

    注:  如果需要把右边的√去掉,el-select加上class和popper-append-to-body=false属性,然后css修改 

    1. /deep/ .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
    2. display: none;
    3. }

    效果图四、 全选全部选中的时候,下拉框的文字是全选,后面是 + 12 数量

    思路: 
    由于添加了:collapse-tags 属性后,全选选中的时候,正常会默认选中第一个label的值显示,后面是 + 全部数量 -1 .  我们可以在初始化的时候,把默认选中的数组里面最前面添加一项“全选”

    1. // 初始化给下拉框选中 的数组赋值
    2. this.biddingStage = [ '京广高速','京包客专', '京哈高速','崇礼线','京沪高铁','京津城际']
    3. this.biddingStage.unshift('全选')

    然后在全选的方法里面:判断如果是全选就在最前面 添加1项 value 值 ‘全选’

    1. // 全选事件
    2. handleCheckAllChange(val) {
    3. const data = this.options.map(item => {
    4. return item.value
    5. })
    6. // this.biddingStage = val ? data : [];
    7. if (val) {
    8. this.biddingStage = data
    9. this.biddingStage .unshift('全选')
    10. } else {
    11. this.biddingStage = []
    12. }
    13. this.isIndeterminate = false;
    14. },

    然后在 下拉框选项改变的时候: 

    1. 先用arr1的变量存一下,把下拉框的数组 过滤出不含 全选的,剩余全部数据

    2. 用selectArr的变量存一下, value的数组 过滤出不含 全选的,剩余全部数据

    然后用新的2个变量去 执行

    1. const checkedCount = selectArr.length
    2. this.isCheckAll = checkedCount === arr1.length
    3. this.isIndeterminate = checkedCount > 0 && checkedCount < arr1.length

    最后在判断  this.isCheckAll  是否是 true  是的话,就是全选。 在数组最前面添加 1项 value  ’全选‘
    否则就移除 ’全选‘
     

    1. if (this.isCheckAll) {
    2. console.log('quanxuan')
    3. this.biddingStage.unshift('全选')
    4. } else {
    5. this.biddingStage = this.biddingStage.filter((item) => {
    6. return item !== '全选'
    7. })
    8. console.log(this.biddingStage)
    9. }

    这部分全部代码如下:

    1. // 线路下拉框选择事件
    2. handleSelect(value) {
    3. console.log('value:', value)
    4. const arr1 = this.options.filter((item) => {
    5. return item !== '全选'
    6. })
    7. const selectArr = value.filter((item) => {
    8. return item !== '全选'
    9. })
    10. const checkedCount = selectArr.length
    11. this.isCheckAll = checkedCount === arr1.length
    12. this.isIndeterminate = checkedCount > 0 && checkedCount < arr1.length
    13. if (this.isCheckAll) {
    14. console.log('quanxuan')
    15. this.biddingStage.unshift('全选')
    16. } else {
    17. this.biddingStage= this.biddingStage.filter((item) => {
    18. return item !== '全选'
    19. })
    20. console.log(this.biddingStage)
    21. }
    22. },

  • 相关阅读:
    Lesson 18 Kaggle医学影像识别 PART 1
    如何设置让vs 在生成程序错误的情况下不去执行上一个可以执行的程序?
    【微机原理笔记】第 2 章 - 微处理器与总线
    并发编程之临界区\阻塞\非阻塞\死锁\饥饿\活锁
    java使用poi、itextpdf将word、ppt转为pdf文件,并对pdf文件加盖签章
    开发人员使用Helix QAC满足合规性的5大原因
    如何用一部手机输出视频内容
    wpa_supplicant介绍
    基于在线问诊记录的抑郁症病患群组划分与特征分析
    MCE | 丙型肝炎病毒的终结之路
  • 原文地址:https://blog.csdn.net/qq_41646249/article/details/133014316