el-element中Cascader 级联选择器懒加载

608 阅读1分钟

在el-element文档中,Cascader组件中关于懒加载的文档写的非常简陋,工作中如果遇见省市区之类的多级下拉时,会看的一头雾水。

最近工作中正好遇见了一个类似需求,如下图所示:

image.png

以下是官方文档上写的:

<el-cascader v-model="industryName" :props="props"></el-cascader>
通过`lazy`开启动态加载,并通过`lazyload`来设置加载数据源的方法。`lazyload`方法有两个参数,第一个参数`node`为当前点击的节点,第二个`resolve`为数据加载完成的回调(必须调用)。为了更准确的显示节点的状态,还可以对节点数据添加是否为叶子节点的标志位 (默认字段为`leaf`,可通过`props.leaf`修改),否则会简单的以有无子节点来判断是否为叶子节点。

那么我们在自己代码中如何优雅的实现呢?

如下,在data中初始化props。leaf的属性一定要注意使用

industryName: []
props: {
lazy: true,
lazyLoad: async (node, resolve) => {
  const { level, value, path } = node
  let res = []
  if (level == 0) { // level为0表示初始化
    const result = await getAllIndustry()
    res = (result.data[1]).map(x => ({ value: x.industryCode, label: x.industryName }))
  } else if ([1, 2, 3].includes(level)) {
    const result = await getIndustry({ parentCode: value })
    res = (result.data).map(x => ({ value: x.industryCode, label: x.industryName, leaf: level === 3 }))
  }
  resolve(res)
}

写完这些,目前基本上已经完成了。

但是有一个隐藏bug,就是当用户点击查看详情,回显数据时,一定要注意字段industryName的初始值必须要先在多级联动开始加载前完成 ,否则回显有问题