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

news2024/11/23 15:22:04

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

本身组件不支持全选,所以增加了全选按钮。覆写了级联面板宽度。可传只勾选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.coloradmin.cn/o/1168205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web测试是什么,有何特点?

Web测试是指对Web应用程序进行验证和评估的过程&#xff0c;以确保其功能、性能和安全性符合预期。 Web测试具体包括以下几个方面的内容&#xff1a; 功能测试&#xff1a;验证Web应用程序是否按照需求规格说明书中定义的功能正常工作。功能测试包括输入验证、表单提交、页面导…

【Jmeter】自动化测试实施

前言&#xff1a; Jmeter是目前最流行的一种测试工具&#xff0c;基于此工具我们搭建了一整套的自动化方案&#xff0c;包括了脚本添加配置、本地配置和运行、服务器配置等内容&#xff0c;完成了自动化测试闭环&#xff0c;通过这种快捷简便高效的方式&#xff0c;希望可以解…

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

聊聊我对AI Agents技术的一些看法

小伙伴们&#xff01;我来兑现承诺啦&#xff5e; ps&#xff1a;接下来期待什么内容&#xff0c;欢迎在评论区留言&#xff01; 今天&#xff0c;我们就来聊聊大模型 Agent。 最近这几个月&#xff0c;Agent 这一概念可谓火出天际&#xff0c;从 AutoGPT 一周 6 万 star 刷新…

桥和割点,以及图的遍历树

目录 什么是桥 寻找桥的算法 代码实现 什么是割点 ​寻找割点的算法 代码实现 什么是桥 寻找桥的算法 代码实现 import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;private int ord[];private int low[];private int cnt…

在钣金加工领域,迅镭激光切割机广泛使用的原因和优点何在?

激光切割工艺和激光切割设备正在被广泛的板材加工企业逐渐理解并接受&#xff0c;凭借其高效率的加工、高精度的加工、优质的切割断面、三维切割能力等诸多优势&#xff0c;逐步取代了传统的钣金切割设备。 苏州迅镭激光科技有限公司推出的激光切割设备的柔性化程度高&#xff…

Vue3 如何在<script setup>里设置组件name属性

Vue3 如何在<script setup>里设置组件name属性 文章目录 Vue3 如何在\<script setup>里设置组件name属性一、Vue组件中 name 的用处二、难看但实用的方法三、使用第三方插件支持安装插件插件基本配置插件基本使用 四、Vue官方解决方法4.1 Vue3.3版本之前安装插件插…

世界坐标系的正方体投影到二维视角【python实验】

为了更进一步理解相机内外参数对应的几何意义&#xff0c;特意设计了一个Python实验。希望对相关初学者有帮助。 实验思路&#xff1a;在世界坐标系上构建一个正方体&#xff0c;然后通过相机内外参数矩阵映射到屏幕坐标系上&#xff0c;观察映射结果。 实验素材&#xff1a;两…

[创业之路-85]:创业公司如何办理云服务器(PaaS)

目录 一、云服务 1.1 云服务器类型 1.2 云服务案例 二、搭建云服务器的基本步骤 二、云服务的架构&#xff08;架构&#xff09; 2.1 层次架构 2.2 云平台统一管理功能 2.3 管理工具 一、云服务 1.1 云服务器类型 云服务&#xff08;Cloud Services&#xff09;是一种…

Notes/Domino中的JVM版本

大家好&#xff0c;才是真的好。 这篇内容主要写给同时关注Domino和Java的技术人员。 很多人都知道&#xff0c;从Notes/Domino R5&#xff08;1999年&#xff09;版本&#xff0c;开始自带一个Java虚拟机&#xff0c;用来支持Java应用运行。但很多人不知道&#xff0c;这个J…

双生幻想角色强度排行最新

最新双生幻想角色强度排行榜分享 关注【娱乐天梯】&#xff0c;获取内部福利号 T0强度角色: 德古拉、天启、洛可可、黑卡蒂 T0.5强度角色:神乐、齐天大圣、真涯、貂蝉、魔龙 T1强度角色: 撒旦、黄月英、甄姬、莱纳、魔王、涂山红红、蝎子莱莱 T2强度角色: 东方月初、御神子、雷…

03、最长连续数列:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09; 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给定一个未排序的整数数…

掌动智能兼容性测试四大优势

兼容性测试是将应用中的场景脚本化&#xff0c;根据业务需求定制脚本&#xff0c;提交到云端千台真机&#xff0c;并行自动测试&#xff0c;从安装、启动、运行、功能、UI、核心业务流程、复杂互动场景等多维度&#xff0c;深度发现应用兼容性问题&#xff0c;并结合人工复审&a…

django毕业设计基于python企业资产管理系统

项目介绍 本文首先介绍了企业资产管理系统的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&…

[LeetCode]-876.链表的中间结点-206.反转链表-21.合并两个有序链表-203.移除链表元素

目录 876.链表的中间结点 题目 思路 代码 206.反转链表 题目 思路 代码 21.合并两个有序链表 题目 思路 代码 203.移除链表元素 题目 思路 代码 876.链表的中间结点 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/mi…

如何使用 NFTScan NFT API 在 Polygon 网络上开发 Web3 应用

Polygon 以前被称为 Matic Network&#xff0c;是一种扩展的解决方案&#xff0c;它提供多种工具来加快并降低区块链网络上交易的成本和复杂性。然而&#xff0c;其区块链上的大量活动使以太坊因增长的传输成本和拥挤的流量几乎瘫痪。Polygon 诞生的主要目的是帮助以太坊解决链…

【C/C++】虚函数表

class Animal { public:virtual void speak(){cout << "动物在说话" << endl;} };class Cat :public Animal { public://重写 函数返回值类型 函数名 参数列表 完全相同void speak(){cout << "小猫在说话" << endl;} };void DoSpe…

Linux C语言进阶-D12~D13函数的基本用法及传参

函数的说明&#xff1a;double power(double x,int n) 函数必须先说明再调用&#xff0c;并且x,n可省略 引入头文件作用&#xff1a;头文件中有函数声明和函数实现&#xff0c;预处理就是头文件展开 定义求x的n次方的函数&#xff08;x:实数&#xff0c;n:正整数&#xff09;…

Python---字符串中的查找方法--find()--括号里是要获取的字符串

字符串查找方法&#xff1a;查找 子串 在字符串中的 位置 或 出现的次数。 子串&#xff1a;要找的 其中一部分 字符串 基本语法&#xff1a; 字符串.find(要查找的字符或者子串) find 英 /faɪnd/ v. 找到&#xff0c;找回&#xff1b;发现&#xff0c;发觉&…

Java 数据结构篇-模拟实现动态数组

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本篇目录 1.0 动态数组说明 2.0 模拟实现动态数组的核心方法 2.1 动态数组-插入与扩容 2.2 动态数组-获取元素 2.3 动态数组-修改元素 2.4 动态数组-删除元素 2.5 动态数组-遍历…