【el-cascader-panel】组件el-cascader-panel使用踩坑

需求背景:角色管理资源,资源返回树形结构数据,左侧树形展示列表可查询,右侧勾选资源权限平铺。

本身组件不支持全选,所以增加了全选按钮。覆写了级联面板宽度。可传只勾选code或者顺序当前节点二维数组列表。

效果

因未配置id报错

<div v-if="dataValueOptions.length" style="height: 32px; line-height 32px; display: flex; align-items: center; border: 1px solid #E4E7ED; border-radius: 4px;">
                <el-checkbox v-model="isAllSelected" @change="handleAllSelectedChange" style=" margin-left: 20px;">全选</el-checkbox>
              </div>
              <el-cascader-panel
                v-if="dataValueOptions.length"
                id="cascaderPanel"   一定要有防止动态生成时,组件报错  option.level 找不到
                ref="cascaderPanel"
                v-model="selectedValues"
                :key="cascaderPanelKey"
                :options="dataValueOptions"
                :props="{
                    expandTrigger: 'click',
                    checkStrictly: false,
                    multiple: isMultiple,
                    emitPath: false,   决定勾选以及初始化选中数据结果
                    value: 'code',
                    label: 'name',
                }"
                @change="handleSelected"
                placeholder="请选择"
                style="width: 100%; height: 400px; overflow-x: auto;"
                :filter-method="dataFilter"
                filterable
              >
                <template slot-scope="{ node, data }">
                  <span v-if="data.name" >{{ `${data.name}` }}</span>
                </template>
              </el-cascader-panel>
              <div v-else style="text-align: center; padding-top: 50px;">暂无数据</div>
            </div>


return {
      relations: [{
        content: '角色'
      }, {
        content: '应用',
      }],
      sureLoad: false,
      roleInfo: {},
      leftLoad: false,
      selectApp: {},
      appName: "",
      appList: [],
      defaultExpandKeys: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      },
      searchLoad: false,
      resourceList: [],
      rightLoad: false,
      isMultiple: true,
      selectedValues: [],
      dataValueOptions: [],
      isAllSelected: false,
      cascaderPanelKey: ""
    }

// 存储初始化勾选的资源
initSelectedCodes(data) {
      for (let i = 0; i < data.length; i++) {
        const node = data[i]
        if (node.selected) {
          this.selectedValues.push(node.code)
        }
        if (node.children) {
          this.initSelectedCodes(node.children)
        }
      }
    },


getAppResourceTree(appId) {
      this.rightLoad = true
      const params = {
        appId: appId,
        roleCode: this.roleInfo.code
      }
      this.$api.getResourceTreeByAppId(params).then(res => {
        this.rightLoad = false
        if (res.code === '0') {
          // 左侧级联选择器默认数据
          this.dataValueOptions = res.result
          // 动态设置key值防止报level错误
          this.cascaderPanelKey = Date.now()
          // 级联选择器默认选中数据
          if (this.dataValueOptions.length) {
            this.initSelectedCodes(this.dataValueOptions)
            // 数据初始化完成且组件已渲染
            this.$nextTick(() => {

              this.handleSelected()
            })
          }
        }
      }).catch((err) => {
        this.$message.error(err)
        this.rightLoad = false
      })
    },
    handleSelected() {
      if (this.dataValueOptions.length) {
        // 获取所有codes,如果长度跟选中长度一致说明是全选,否则部分选中
        const codes = []
        this.getAllCodes(this.dataValueOptions, codes)
        if (this.$refs.cascaderPanel && this.selectedValues && this.selectedValues.length) {
          this.isAllSelected = codes.length === this.$refs.cascaderPanel.getCheckedNodes().length
        }
      }
    },
    dataFilter(node, val){
      const baseName = node.data.baseName.toUpperCase()
      const baseValue = node.data.baseValue.toUpperCase()
      const inputVal = val.toUpperCase()
      if(baseName.indexOf(inputVal) !== -1 || baseValue.indexOf(inputVal) !== -1){
          return true
      }
    }


resetQuery() {
      this.isAllSelected = false
      this.appName = ""
      this.resourceList = []
      this.selectedValues = []
      this.dataValueOptions = []
      this.getAppList()
    }

// 额外方法,如果后台需要勾选的节点的所有顺序父节点包括勾选的节点
findParentCodes(treeData, selectedCode, parentCodes = []) {
      for (let i = 0; i < treeData.length; i++) {
        const node = treeData[i]
        if (node.code === selectedCode) {
          return [...parentCodes, node.code]
        }
        if (node.children) {
          const result = this.findParentCodes(node.children, selectedCode, [...parentCodes, node.code])
          if (result) {
            return result
          }
        }
      }
      return null;
    }

方法使用。
for (let i = 0; i < this.selectedRootCodes.length; i++) {
              const selectedRootCode = this.selectedRootCodes[i]
              if (selectedRootCode) {
                const selectedCodes = this.findParentCodes(this.dataValueOptions, selectedRootCode)
                if (selectedCodes.length) {
                  this.selectedValues.push(selectedCodes)
                }
              }
            }
/* 自定义面板样式 */
    #right .el-cascader-menu__wrap,
    #right .el-scrollbar__wrap {
      overflow-x: auto;
      overflow-y: hidden;
      height: 404px;
      margin-right: 0px !important;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件-RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布&#xff0c;是一个在AMQP(高级消息队列协议)基础上完成的&#xff0c;简称MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法&#xff0c;由Erlang&#xff08;专门针对于大…

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python

这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…

WebGL:基础练习 / 简单学习 / demo / canvas3D

一、前置内容 canvas&#xff1a;理解canvas / 基础使用 / 实用demo-CSDN博客 WebGL&#xff1a;开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客 二、在线运行HTML 用来运行WebGL代码&#xff0c;粘贴--运行&#xff…

【JMeter】插件管理工具

1. 官方下载地址 Documentation :: JMeter-Plugins.org 2.安装 将该插件的jar包移动到lib/ext下 3.重启JMeter就可以看到插件管理器 4. 安装&#xff0c;更新&#xff0c;删除插件 安装插件 删除插件 更新插件

【Java】三种方案实现 Redis 分布式锁

序言 setnx、Redisson、RedLock 都可以实现分布式锁&#xff0c;从易到难得排序为&#xff1a;setnx < Redisson < RedLock。一般情况下&#xff0c;直接使用 Redisson 就可以啦&#xff0c;有很多逻辑框架的作者都已经考虑到了。 方案一&#xff1a;setnx 1.1、简单实…

九、W5100S/W5500+RP2040树莓派Pico<SNTP 获取网络时间>

文章目录 1 前言2 协议简介2.1 什么是SNTP2.2 SNTP的优点2.3 SNTP原理2.4 应用场景 3 WIZnet以太网芯片4 SNTP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着科技的不断进步和应用需求的不断变…

虚拟dom及diff算法之 —— h函数和diff函数

新虚拟dom和老虚拟dom进行diff算法&#xff08;精细化比较&#xff09;&#xff0c;算出如何最小量更新&#xff0c;最后反映到真实dom上 diff是发生在虚拟dom上的 模板编译 虚拟dom如何产生 - 渲染函数&#xff08;h函数&#xff09; h函数产生虚拟节点&#xff08;vnode&a…

Linux: MV指令(覆盖替换重命名)

MV指令 mv [-bfiuv] [–help] [–version] [-S <附加字尾>] [-V <方法>] [源文件或目录] [目标文件或目录]-b 若需覆盖文件&#xff0c;则覆盖前先行备份-f 若目标文件或目录与现有的文件或目录重复&#xff0c;则直接覆盖现有的文件或目录-i 覆盖前先行询问用户–…

【LeetCode刷题-队列】--2073.买票需要的时间

2073.买票需要的时间 方法一&#xff1a;使用队列 class Solution {public int timeRequiredToBuy(int[] tickets, int k) {Queue<TicketBuyer> queue new LinkedList<>();for(int i 0;i<tickets.length;i){TicketBuyer buyer new TicketBuyer();buyer.inde…

快速了解推荐引擎检索技术

目录 一、推荐引擎和其检索技术 二、推荐引擎的整体架构和工作过程 &#xff08;一&#xff09;用户画像 &#xff08;二&#xff09;文章画像 &#xff08;三&#xff09;推荐算法召回 三、基于内容的召回 &#xff08;一&#xff09;召回算法 &#xff08;二&#xf…

linux基础学习

迷茫不可怕&#xff0c;说明你还在向前走 失败不可怕&#xff0c;只要你还能爬起来 ​​​​​​​ 目录 ​编辑 为什么要学习linux操作系统&#xff1f; linux系统的安装 FinalShell 虚拟机快照 第二章 基本知识 linux目录结构 linux路径的描述方式 linux命令入门…

【C语言进阶】之动态内存管理笔试题及柔性数组

【C语言进阶】之动态内存管理笔试题 1.动态内存管理笔试题汇总1.1第一道题1.2第二道题1.3第三道题1.4第四道题 2.C/C内存管理3.柔性数组3.1什么是柔性数组3.2柔性数组的使用3.2柔性数组的优点 &#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f680; 欢迎关注&#xff1a…