vue——下拉选择框新增全选选项

下拉选择框新增全选选项

  • elementUI原本组件
  • 实现效果
  • 实现代码

elementUI原本组件

elementUI原本组件是没有全选这个选项的vue——下拉选择框新增全选选项_第1张图片

实现效果

我们要实现的就是把全选选项给它加上
vue——下拉选择框新增全选选项_第2张图片

实现代码

<template>
  <el-select
    v-model="selectValue"
    collapse-tags
    multiple
    placeholder="请选择"
    @change="selectAll"
  >
    <el-option
      v-for="(item, index) in options"
      :key="index"
      :label="item.label"
      :value="item.value"
    />
  </el-select>
</template>

<script>
export default {
     
  name: 'Select',
  data() {
     
    return {
     
      options: [
          {
     
            value: 'ALL_SELECT',
            label: '全选'
          },
          {
     
            value: 0,
            label: '选项一'
          },
          {
     
            value: 1,
            label: '选项二'
          },
          {
     
            value: 2,
            label: '选项三'
          }
        ],
      selectValue: [],
      oldOptions: []
    }
  },
  methods: {
     
    selectAll(val) {
     
      const allValues = []
      // 保留所有值
      for (const item of this.options) {
     
        allValues.push(item.value)
      }
      // 用来储存上一次的值,可以进行对比
      const oldVal = this.oldOptions.length === 1 ? this.oldOptions[0] : []
      // 若是全部选择
      if (val.includes('ALL_SELECT')) this.selectValue = allValues
      // 取消全部选中 上次有 当前没有 表示取消全选
      if (oldVal.includes('ALL_SELECT') && !val.includes('ALL_SELECT')) {
      this.selectValue = [] }
      // 点击非全部选中 需要排除全部选中 以及 当前点击的选项
      // 新老数据都有全部选中
      if (oldVal.includes('ALL_SELECT') && val.includes('ALL_SELECT')) {
     
        const index = val.indexOf('ALL_SELECT')
        val.splice(index, 1) // 排除全选选项
        this.selectValue = val
      }
      // 全选未选 但是其他选项全部选上 则全选选上 上次和当前 都没有全选
      if (!oldVal.includes('ALL_SELECT') && !val.includes('ALL_SELECT')) {
     
        if (val.length === allValues.length - 1) {
      this.selectValue = ['ALL_SELECT'].concat(val) }
      }
      // 储存当前最后的结果 作为下次的老数据
      this.oldOptions[0] = this.selectValue
    }
  }
}
</script>

你可能感兴趣的:(vue,vue,javascript,vue.js,html)