el-cascader 级联选择器实现动态获取数据 并且回显!!!

6,139 阅读2分钟

需求:

1,先请求一个接口,获取级联选择器的第一层数据
2,根据点击的第一层数据中的某一条获取的id获取后台数据,渲染级联选择器的第二层数据

lazyLoad函数页面进来的时候会自动调用一次 拿到省的数据 level = 0

  • 点击省份的时候 level = 1
  • 点击市区的时候 level = 2
  • 点击区县的时候 level 是没了 最后一层了

image.png

默认第一次进来node的数据打印: image.png 第一层打印: image.png

  if (node.level == 0) {
        var params = "";
      } else {
        var params = node.value;
      }
      if (node.level <= 3) {
        //层级不能大于3
        try {
          const res = await getArea(params);
          if (res.code === 200) {
            const nodes = res.data.map(item => ({
              // ...item,//?
              label: item.name,
              id: item.id,
              value: item.areaCode,
              leaf: level >= 2 //? 指定选项的叶子节点的标志位为选项对象的某个属性值  3 >= 2 => true
            }));
            // 通过调用resolve将子节点数据返回,通知组件数据加载完成
            resolve(nodes);
          }
        } catch (error) {
          console.log(error);
        }

多层判断改为json对象:

  const requestData = {
        0: "",
        1: node.value,
        2: node.value
      };
      try {
        const res = await getArea(requestData[level]);
        if (res.code === 200) {
          const nodes = res.data.map(item => ({
            label: item.name,
            id: item.id,
            value: item.areaCode,
            leaf: level >= 2 
          }));
          // 通过调用resolve将子节点数据返回,通知组件数据加载完成
          resolve(nodes);
        }
      } catch (error) {
        console.log(error);
      }

或者是: switch 语句


const areaProps = {
  lazy: true,
  async lazyLoad(node: any, resolve: any) {
    const { level, data } = node;
    let nodes;
    switch (level) {
      case 0:
        nodes = await useProvince();
        break;
      case 1:
        nodes = await useCity(data.value.key);
        break;
      case 2:
        nodes = await useRegion(data.value.key);
        break;
    }
    resolve(nodes);
  },
};

image.png 也可以用 ‘-’分隔


<el-cascader
  v-model="updateForm.category"
  separator="-"
  :props="cascaderProps"
></el-cascader>

需要注意的是,leaf是一个booler值,为true时不显示子节点,反之显示。其他参数直接赋值即可。

leaf 为true 通俗一点解释就是 有下级

leaf: level >= 3 试了一下 最后一级是没有level的
image.png

解决方法:

方法一:动态开关lazy属性和数据初始化的时候动态初始化options解决这个问题。(亲测有效!!!)

  created() {
    this.props = {
      lazy: true,
      lazyLoad: async (node, resolve) => {
        const { level } = node;
        // 请求参数
        const requestData = {
          0: "",
          1: node.value,
          2: node.value
        };
        try {
          const res = await getArea(requestData[level]);
          if (res.code === 200) {
            const nodes = res.data.map(item => ({
              label: item.name,
              id: item.id,
              value: item.areaCode,
              leaf: level >= 2
            }));
            // 通过调用resolve将子节点数据返回,通知组件数据加载完成
            resolve(nodes);
          }
        } catch (error) {
          console.log(error);
        }
      }
    };
    this.position = ['110000', '110100', '110105'];
  },

方法二:,省市区拆分成三个下拉框了,

这样处理起来方便很多,不过这样也就没有所谓的cascader

有兴趣可以看下其它人的例子:

www.imooc.com/article/311… www.cnblogs.com/orzzt/p/158…