需求

在select下拉菜单的选项前添加多选框checkbox,并且有一个全选选项

效果如下:

实现方法

在el-option选项中嵌入el-checkbox组件

<el-select
          v-model="selectValueArray"
          multiple
          collapse-tags
          placeholder="请选择分析专题"
          class="select-with-checkbox"
        >
          <el-option
            v-for="item in analysisSubject"
            class="my-select"
            :key="item.value"
            :value="item.value"
            :disabled="item.disabled"
          >
            <el-checkbox
              class="inner-checkbox"
              :disabled="item.disabled"
              v-model="item.checked"
              @change="onSelectChange"
              >{{ item.label }}</el-checkbox
            >
          </el-option>
</el-select>

样式修改

// 屏蔽原有的选中图标
.my-select::after {
  display: none;
}
// 将checkbox的大小覆盖整个选项
.inner-checkbox {
  width: 100%;
  padding: 0 20px;
}
// 原有选项padding置0
.el-select-dropdown__item {
  padding: 0;
}
// 偷懒屏蔽了input中选项的关闭按钮
.select-with-checkbox {
  ::v-deep .el-tag.el-tag--info .el-tag__close {
    display: none;
  }
}

TypeScript代码如下:

export default class ComplianceAudit extends Vue {  
  
  	private selectValueArray: any[] = []; // 已选信息数组
  	private oldSelectValueArray: any[] = []; // 记录上次选择的信息数组
    //analysisSubject数组的格式如下:
    private analysisSubject: any[] = [
        // 选项信息数组
        {
          value: "城镇开发边界",
          label: "城镇开发边界",
          checked: false
        },
        {
          value: "1111",
          label: "2222",
          checked: false
        },
        { value: "ALL_SELECT", label: "全选", checked: false }
    ]
    /**
     * checkbox修改事件onSelectChange:
     */
    private onSelectChange(val: any[]) {
        this.selectValueArray = [];	// 已选信息数组置空
        // allValues为所有选项值的数组
        const allValues = this.analysisSubject.map(item => {
          if (item.checked) {
            // 将checked为true的值放入已选信息数组
            this.selectValueArray.push(item.value);
          }
          return item.value;
        });
        // 上一次选择的值,进行对比
        const oldVal =
          this.oldSelectValueArray.length > 0 ? this.oldSelectValueArray : [];
        // 选择全部,这次含有全选项且上次没有
        if (
          this.selectValueArray.includes("ALL_SELECT") &&
          !oldVal.includes("ALL_SELECT")
        ) {
          this.selectValueArray = allValues;
          this.changeCheckboxStatus(this.analysisSubject, "ALL", true);
        }
        // 取消全部选中,上次存在全选项,当前没有,则取消全选
        if (
          oldVal.includes("ALL_SELECT") &&
          !this.selectValueArray.includes("ALL_SELECT")
        ) {
          this.selectValueArray = [];
          this.changeCheckboxStatus(this.analysisSubject, "ALL", false);
        }
        // 点击非全部选中,需要排除全部选中 以及 当前点击的选项
        // 新老数据都有全部选中
        if (
          oldVal.includes("ALL_SELECT") &&
          this.selectValueArray.includes("ALL_SELECT")
        ) {
          const index = this.selectValueArray.indexOf("ALL_SELECT");
          this.selectValueArray.splice(index, 1); // 排除全选选项
          this.changeCheckboxStatus(this.analysisSubject, "ALL_SELECT", false);
        }
        // 全选未选,但是其他选项都全部选上了,则全选选上
        if (
          !oldVal.includes("ALL_SELECT") &&
          !this.selectValueArray.includes("ALL_SELECT")
        ) {
          if (this.selectValueArray.length === allValues.length - 1) {
            this.selectValueArray.push("ALL_SELECT");
            this.changeCheckboxStatus(this.analysisSubject, "ALL_SELECT", true);
          }
        }
        // 储存当前选择的最后结果 作为下次的老数据
        this.oldSelectValueArray = this.selectValueArray;
      }
    
      /**
       * 修改复选框选中状态
       */
      private changeCheckboxStatus(list: any, value: string, status: boolean) {
        // 全部修改
        if (value == "ALL") {
          list.forEach((item: any) => {
            item.checked = status;
          });
        } else {
          // 指定某个值修改
          list.forEach((item: any) => {
            if (item.value == value) {
              item.checked = status;
            }
          });
        }
    
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Canvas教程学习 上一篇
Axios取消上次请求 下一篇