当前位置:   article > 正文

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

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. <template>
  2. <el-select multiple collapse-tags v-model='selectedArray' @change='changeSelect' @remove-tag='removeTag' placeholder='请选择'>
  3. <el-option label='全选' value='全选' @click.native='selectAll'></el-option>
  4. <el-option v-for='(item, index) in options' :key='index' :label='item.name' :value='item.name'></el-option>
  5. </el-select>
  6. </template>
  7. export default {
  8. data() {
  9. return {
  10. selectedArray: [],
  11. options: [
  12. { name: '一一', label: 'one' },
  13. { name: '二二', label: 'tow' },
  14. { name: '三三', label: 'three' },
  15. { name: '四四', label: 'four' },
  16. { name: '五五', label: 'five' }
  17. ]
  18. }
  19. },
  20. methods: {
  21. selectAll() {
  22. if (this.selectedArray.length < this.options.length) {
  23. this.selectedArray = []
  24. this.options.map((item) => {
  25. this.selectedArray.push(item.name)
  26. })
  27. this.selectedArray.unshift('全选')
  28. } else {
  29. this.selectedArray = []
  30. }
  31. },
  32. changeSelect(val) {
  33. if (!val.includes('全选') && val.length === this.options.length) {
  34. this.selectedArray.unshift('全选')
  35. } else if (val.includes('全选') && (val.length - 1) < this.options.length) {
  36. this.selectedArray = this.selectedArray.filter((item) => {
  37. return item !== '全选'
  38. })
  39. }
  40. },
  41. removeTag(val) {
  42. if (val === '全选') {
  43. this.selectedArray = []
  44. }
  45. }
  46. }
  47. }

效果图二、

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

  1. <template>
  2. <el-select multiple collapse-tags v-model='selectedArray' @change='changeSelect' placeholder='请选择'>
  3. <el-checkbox v-model="checked" @change='selectAll'>全选</el-checkbox>
  4. <el-option v-for='(item, index) in options' :key='index' :label='item.name' :value='item.name'></el-option>
  5. </el-select>
  6. </template>
  7. export default {
  8. data() {
  9. return {
  10. checked: false,
  11. selectedArray: [],
  12. options: [
  13. { name: '一一', label: 'one' },
  14. { name: '二二', label: 'tow' },
  15. { name: '三三', label: 'three' },
  16. { name: '四四', label: 'four' },
  17. { name: '五五', label: 'five' }
  18. ]
  19. }
  20. },
  21. methods: {
  22. selectAll() {
  23. this.selectedArray = []
  24. if (this.checked) {
  25. this.options.map((item) => {
  26. this.selectedArray.push(item.name)
  27. })
  28. } else {
  29. this.selectedArray = []
  30. }
  31. },
  32. changeSelect(val) {
  33. if (val.length === this.options.length) {
  34. this.checked = true
  35. } else {
  36. this.checked = false
  37. }
  38. }
  39. }
  40. }
  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. <el-select
  2. v-model="lineNumStage"
  3. v-bind="$attrs"
  4. multiple
  5. style="width: 100%;"
  6. placeholder="请选择线路"
  7. @change="handleSelect"
  8. >
  9. <div style="padding: 0 20px; line-height:34px">
  10. <el-checkbox v-model="isCheckAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选</el-checkbox>
  11. </div>
  12. <el-checkbox-group v-model="lineNumStage">
  13. <el-option v-for="item in checkedLineArry" :key="item.value" :label="item.name" :value="item.value">
  14. <el-checkbox style="pointer-events: none" :label="item.value">
  15. {{ item.label }}
  16. </el-checkbox>
  17. </el-option>
  18. </el-checkbox-group>
  19. </el-select>
  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. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/107212?site
推荐阅读