【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;
}

相关推荐
无巧不成书02181 小时前
Windows PowerShell执行策略详解:从npm报错到完美解决
前端·windows·npm·powershell执行策略·执行策略·npm.ps1·脚本报错
Z兽兽7 小时前
React@18+Vite项目配置env文件
前端·react.js·前端框架
SuniaWang7 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
A_nanda8 小时前
根据AI提示排查vue前端项目
前端·javascript·vue.js
happymaker06269 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
~无忧花开~9 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
LegendNoTitle9 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php
@大迁世界9 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
BJ-Giser10 小时前
Cesium 基于EZ-Tree的植被效果
前端·可视化·cesium
王码码203511 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos