优化Element-ui中 el-cascader 级联选择器 最后一级数据为空显示暂无数据

3,889 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

背景

我们的项目中需要细分行业类型,故会有行业层级的选取,以供用户选择

1.出现的问题

el-cascader控件 最后一级出现空白 显示暂无数据

级联数据1.gif

2.原因剖析

鉴于数据是从后台传递过来的,故先查看了数据格式,发现数据中的最底层子项中的children为空数组,经过调试分析出现空级联原因就是这个问题直接导致的。

级联数据3.png

3.解决办法

采用递归的方式,作判空处理,将子项为空的children赋值为undefined

<el-form-item v-if="$hasPermission('sys:zyindustry:getList')">
    <el-cascader
        placeholder="---请选择行业类型---"
        :clearable="true"
        :filterable="true"
        :options="optionIndustryType"
        :props="defaultProps"
        @change="handleChange"
        style="width:500px"
    >
    </el-cascader>
</el-form-item>
data(){
    return {
        optionIndustryType: [],
        defaultProps: {
            label: "industryName", // 显示的选项
            value: "id", // 选择的value值
            children: "children", // 子级属性名
            checkStrictly: true, // 可以选择任意一级
        }, // 指定层级属性
    }
}

async mounted () {
   this.optionIndustryType = await this.getTreeList()
}

//utils 方法

// 获取级联树结构列表
export function getTreeList() {
  let industryList = [];
  return new Promise((resolve, reject) => {
    this.$http.get(`/sys/zyindustry/getTreeList`).then(({ data }) => {
      if (data && data.code === 0) {
        industryList = getTreeData(data.industryList);
        resolve(industryList);
      } else {
        industryList = [];
        reject(industryList);
      }
    });
  });
}

// 递归判断列表,把最后的children设为undefined
function getTreeData(data) {
  for (let i = 0; i < data.length; i++) {
    if (data[i].children.length < 1) {
      // children若为空数组,则将children设为undefined
      data[i].children = undefined;
    } else {
      // children若不为空数组,则继续 递归调用 本方法
      getTreeData(data[i].children);
    }
  }
  return data;
}

最终效果

级联数据2.gif