
在做运费模板配置功能中,客户要求快递模板能细化到县一级,这个时候需要使用到el-cascader级联选择器,由于一次加载全部省市县数据会导致渲染很慢,所以需要采用懒加载模式,多个el-cascader级联选择器组件之间的数据是需要进行互斥的,那么懒加载模式下如何进行数据互斥是比较复杂的,经过读el-cascader源码才用了一天时间最终实现互斥,方法如下:
1、在组件中添加visible-change、expand-change两个事件,分别在展开树形面板和加载新节点的时候对数据进行判定。
<el-cascader v-if="cascaderShow" :ref="setReceiveRegionRef" @visible-change="(val)=>checkChangeReceiveRegion(val,index)" @expand-change="(val)=>checkChangeReceiveRegion(val,index)" @change="(val)=>changeReceiveRegion(val,index)" v-model="item.expressAreaIds" placeholder="请选择地区" :props="receiveRegionProps" style="width: 100%;min-width:200px;">
<template #default="{ node, data }">
<span>{{ node.label }}</span>
<span v-if="data.disabled==true" style="float: right;color:darkcyan">
(已占用)
</span>
</template>
</el-cascader>2、对数据进行判定,关键的修改的数据就是对渲染组件panel.menus中的data.disabled进行处理。
checkChangeReceiveRegion:(val,index)=>{
let type=typeof val
if((type=="boolean"&&val==true)||type=='object'){
let menus=receiveRegionRefList.value[index].panel.menus
//menus[0][0].data.disabled=true
//获取运送方式规则中其他的menu
for(let i in form.value.costRule){
if (i!=index){
for(let j in form.value.costRule[i].expressAreaIds){
let areaIds = form.value.costRule[i].expressAreaIds[j]
//其他规则中已经包含的地区需要禁用
disabledMenu(menus[0],areaIds)
}
}
}
}
}
const disabledMenu=(menus,areaIds)=>{
for(let m in menus){
if(menus[m].pathValues.join(',')==areaIds.join(',')){
menus[m].data.disabled=true
break;
}
console.log('递归menus',menus[m])
let children = menus[m].children
if(children.length>0){
disabledMenu(children,areaIds)
}
}
}
2013-2024 LifeAdd生活方式 www.lifeadd.cn 版权所有 | 御融(北京)科技有限公司 All Rights
Reserved
增值电信业务经营许可证:京B2-20200664 | 京ICP备14004911号-7