使用el-cascader组件写下拉级联多选并且具有全选功能

样式

说明: 级联选择器中加上全选的按钮, 并且保证数据响应式。

思路

  • 因为是有全选的功能,所以不能直接使用el-cascader组件, 而是选择使用el-select组件, 在此组件内部使用el-cascader-panel级联面板
  • 全选按钮也是写在el-select组件中, 并且去监听全选按钮的状态, 根据全选的状态, 决定级联面板的数据与样式
  • 如果想要获取到最终选择的数据, 还是取级联面板绑定的值,而不是select的值。

代码实现

template:

注意:

1,el-select组件中,必须要写入一个el-option组件, 可以隐藏, 但必须存在

2,选中的数据响应式绑定的其实是级联面板的数据,同步到了select中,并且满足其展示的内容,比如"已选中2项"

javascript 复制代码
 <el-form-item>
        <div class="theme-date theme">
          <div class="theme-date-prepend">功能模块</div>
          <el-select v-model="selectModuleData">
            <el-option style="display: none" value=""></el-option>
            <el-checkbox class="allselect" v-model="allSelectModule"
              >全选</el-checkbox
            >
            <el-cascader-panel
              ref="cascaderModule"
              :options="treeList"
              v-model="cascaderModuleData"
              popper-class="popper-select"
              :show-all-levels="false"
              :props="cascaderProp"
              clearable
            >
            </el-cascader-panel>
          </el-select>
        </div>
      </el-form-item>

script:

javascript 复制代码
// data数据:
cascaderProp: {
        multiple: true,
        value: "name",
        label: "name",
        children: "children",
      },
allSelectModule: false,
cascaderModuleData: [],
selectModuleData: null,

// watch
watch: {
// 监听多选按钮是否被勾选
    allSelectModule: {
      immediate: true,
      handler(newVal) {
        if (newVal) {
        /// 执行的方法,可以在下面的methods中寻找
          this.cascaderAllSelect();
        } else {
          if(!this.$refs.cascaderModule) return
          this.$refs.cascaderModule.clearCheckedNodes();
          this.$refs.cascaderModule.checkedValue = []; // 清空选中值
          this.cascaderModuleData = [];
          this.$refs.cascaderModule.activePath = []; // 清除高亮
          this.$refs.cascaderModule.syncActivePath(); // 初始化(只展示一级节点)
        }
      },
    },
    // 监听级联面板绑定的数据去同步select的数据, 让其显示在选择框中
    cascaderModuleData: {
      immediate: true,
      handler(newVal) {
        if (newVal.length === 0) {
          this.selectModuleData = "";
          if(!this.$refs.cascaderModule) return
          this.$refs.cascaderModule.activePath = []; // 清除高亮
          this.$refs.cascaderModule.syncActivePath(); // 初始化(只展示一级节点)
        } else {
          this.selectModuleData = `已选${newVal.length}项`;
        }
      },
    },
  },
/// methods
// 级联选择器全选, 其中moduleArray表示的是级联面板绑定的数据,表示如果此时没有全选的话那就将所有的数据,赋值到级联面板中,这样在显示中,就表示全选的状态。
    cascaderAllSelect() {
      if (this.cascaderModuleData.length !== this.moduleArray.length) {
        this.cascaderModuleData = this.moduleArray;
      }
    },
// 直接获取级联面板的数据cascaderModuleData, 作为参数提交即可
相关推荐
程序员小寒3 分钟前
Vue.js 为什么要推出 Vapor Mode?
前端·javascript·vue.js
白菜__10 分钟前
去哪儿小程序逆向分析(酒店)
前端·javascript·爬虫·网络协议·小程序·node.js
前端老曹11 分钟前
Jspreadsheet CE V5 使用手册(保姆版) 二
开发语言·前端·vue.js·学习
IT_陈寒12 分钟前
SpringBoot3.0实战:5个高并发场景下的性能优化技巧,让你的应用快如闪电⚡
前端·人工智能·后端
秋邱12 分钟前
AR 定位技术深度解析:从 GPS 到视觉 SLAM 的轻量化实现
开发语言·前端·网络·人工智能·python·html·ar
老华带你飞16 分钟前
动物救助|流浪狗救助|基于Springboot+vue的流浪狗救助平台设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·流浪动物救助平台
云飞云共享云桌面19 分钟前
佛山某机械加工设备工厂10个SolidWorks共享一台服务器的软硬件
大数据·运维·服务器·前端·网络·人工智能·性能优化
开发者小天23 分钟前
React中使用classnames的案例
前端·react.js·前端框架
简单的话*30 分钟前
Logback 日志按月归档并保留 180 天,超期自动清理的配置实践
java·前端·python
困惑阿三33 分钟前
深入理解 JavaScript 中的(Promise.race)
开发语言·前端·javascript·ecmascript·reactjs