1. element ui 级联选择器动态加载子菜单,使用多选并且关联父子节点时无法返回选中节点的正确实现

<template>
  <div>
    <div class="df jsw mtb10 top-box">
      <div class="rightBox">
        <el-cascader
          v-model="selected.cascader"
          :props="cascaderProps"
          @change="standChange"
          placeholder="全部变电站"
          size="small"
          collapse-tags
        ></el-cascader>
    <div>
  </div>
</template>

<script>
import { getSubControlAreaList } from '@/api/zts-gis/subControlArea' 
import { getSubstationList } from '@/api/zts-gis/substation'
import { getMeasurementList } from '@/api/zts-gis/measurement'

export default {
  data() {
    return {
      // 级联选择器
      cascaderProps: {
        lazy: true,
        multiple: true,
        maxLevel: this.maxLevel,
        // checkStrictly: true,
        lazyLoad (node, resolve) {
          const { level } = node;
          // console.log("node", node)
          // console.log("resolve", resolve)
          if( level == 0 ){
            getSubControlAreaList().then((response) => {
              console.log("所有片区", response)
              if(response.code == 0 ){
                let area = response.data.map((v) => {
                  // console.log(1684, level, this.maxLevel, level >= this.maxLevel-1)
                  if(level >= this.maxLevel-1) {
                    return {
                      value: v.id,
                      label: v.name,
                      leaf: true
                    }
                  }else{
                    return {
                      value: v.id,
                      label: v.name
                    }
                  }
                })
                resolve(area);
              }
            })
          }else if( level == 1 ){
            if(level >= this.maxLevel-2){
              resolve([]);
            }
            let id = node.value
            getSubstationList({ areaId: id }).then((response) => {
              console.log("所有厂站", response)
              if(response.code == 0 ){
                let area = response.data.map((v) => {
                  if(level >= this.maxLevel-1) {
                    return {
                      value: v.id,
                      label: v.name,
                      leaf: true
                    }
                  }else{
                    // 为每一个节点添加一个不显示的叶子节点,使没有加载到最后一个选项时前面的选项可选中           
                    return {
                      value: v.id,
                      label: v.name,
                      children: [
                        {
                          value: null,
                          label: null,
                          leaf: true
                        }
                      ]
                    }
                  }
                })
               
                // node.data.children = area
                resolve(area);
              }
            })
          }else if( level == 2 ){
            if(level >= this.maxLevel-2){
              resolve([]);
            }
            // 因为前面在父节点的子节点添加了一个空children, 在此删除父节点的children
            node.children = []

            let id = node.value
            getMeasurementList({ substationId: id }).then((response) => {
              console.log("所有变电站", response)
              if(response.code == 0 ){
                let area = response.data.map((v) => {
                  return {
                    value: v.equipment,
                    label: v.name,
                    leaf: true                     // 表示所有层级的最后一层
                  }
                })
                // node.data.children = area
                resolve(area);
              }
            })
          }else{
            resolve([]);
          }
        }
      },

    }
  }
}
</script>

<style lang="scss" scoped> </style>

 

 

若不指定节点的结束层,会无法绑定值到变量中,且不会触发 change 方法

posted on 2022-01-27 14:39  occc  阅读(988)  评论(0编辑  收藏  举报