el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

news2024/10/2 20:35:44

需要实现的需求

  • 数据渲染使用懒加载
  • 点击任意一级都可返回,不需要一直点到最后一级
  • 编辑或者查看功能,回显之前选择的数据

实例解析

dom 元素

<el-cascader
  v-model="value"
  :options="options"
  :props="props"
  :key="num"
  @change="chaangeFunc"
  ref="refHandle"

></el-cascader>
  • value - 级联选择器绑定的数据
  • options - 级联选择器列表数据
  • props - 级联选择器配置内容
  • num - 为级联选择器设置节点,后续在数据变化时,可以更新节点通知 DOM 更新
  • chaangeFunc - 监听级联选择器的选择事件

模拟接口

// 模拟接口数据
// level:层级,key:用上一级查下一级参数使用的标识
getTempData(level, key) {
  return new Promise((resolve, reject) => {
    let result = []; // 最终要返回的数据
    if (level == 1) {
      // 一级的数据
      result = [
        { label: "测试1", value: 1, level: 1 },
        { label: "测试2", value: 2, level: 1 },
      ];
    }
    if (level == 2) {
      // 二级的数据
      if (key == 1) {
      	// "测试1" 查回来的子数据
        result = [
          { label: "测试1-1", value: 11, level: 2 },
          { label: "测试1-2", value: 12, level: 2 },
          { label: "测试1-3", value: 13, level: 2 },
        ];
      }
    }
    if (level == 3) {
      // 二级的数据
      if (key == 11) {
        // "测试1-1" 查回来的子数据
        result = [
          { label: "测试1-1-1", value: 111, level: 3 },
          { label: "测试1-1-2", value: 112, level: 3 },
          { label: "测试1-1-3", value: 113, level: 3 },
        ];
      }
    }
    setTimeout((item, index) => {
      console.log("级联请求到的数据", result);
      // 做一个延时,模拟接口数据返回
      resolve(result);
    }, 1000);
  });
}
// 完整的数据结构
// [{
//   label: "测试1",
//   value: 1,
//   children: [
//     {
//       label: "测试1-1",
//       value: 11,
//       children: [
//         { label: "测试1-1-1", value: 111 },
//         { label: "测试1-1-2", value: 112 },
//         { label: "测试1-1-3", value: 113 },
//       ],
//     },
//     { label: "测试1-2", value: 12 },
//     { label: "测试1-3", value: 13 },
//   ],
// },
// { label: "测试2", value: 2, children: [] },]

渲染数据

  • 默认请求一级数据
// 默认请求一级数据
this.getTempData(1).then((dataLev1) => {
 this.options = dataLev1;
});
  • 级联选择器懒加载函数

checkStrictly
是否严格的遵守父子节点不互相关联
boolean

lazyLoad
加载动态数据的方法,仅在 lazy 为 true 时有效
function(node, resolve),node 为当前点击的节点,resolve 为数据加载完成的回调(必须调用)

props: {
  checkStrictly: true, // 取消父节点与子节点的严格关联,可以任意选中任何一级作为结束
  lazy: true,
  lazyLoad: (node, resolve) => {
    let result = node.data;
    console.log("点击的节点数据", result);
    if (result) {
      if (result.level != 3) {
        // 如果当前点击的不是第三级,则需要去调用接口查询数据
        this.getTempData(Number(result.level) + 1, result.value).then(
          (sourceData) => {
            let data = [];
            if (sourceData && sourceData.length > 0) {
              data = sourceData;
            }
            // 将获取到的数据抛出
            resolve(data);
          }
        );
      } else {
        resolve([]);
      }
    } else {
    }
  },
},
  • 效果
    • 默认渲染一级
      默认渲染一级
    • 点击请求二级
      点击请求二级
    • 再点击请求三级
      再点击请求三级
    • 选中任意一级都能返回
      选中任意一级都能返回
// 如果需要在选中后关闭级联弹层,监听 change 事件即可
chaangeFunc() {
  console.log("触发了change", this.value);
  // 选中节点后,关闭下拉
  this.$refs.refHandle.dropDownVisible = false;
}

数据回显

  • 第一步,获取级联下拉列表的 options,不需要全部渲染,只需要渲染被选中的部分的那一条链路
  • 第二步,为级联选择器绑定的 value 赋值
  • 第三步,为最后一级添加 leaf 属性,告诉结构树此节点为末级节点

this.value

getDetail() {
  let detailList = [1, 11, 111]; // 模拟获取到的需要渲染的节点数据
  this.getTempData(1).then((dataLev1) => {
    this.options = dataLev1;
    console.log("渲染完了一级");
    this.options.map((itemLev1, indexLev1) => {
      if (itemLev1.value == detailList[0]) {
        console.log("匹配到一级选中内容,开始查询二级");
        this.getTempData(2, itemLev1.value).then((dataLev2) => {
          if (dataLev2 && dataLev2.length > 0) {
            console.log("查询到了二级数据,继续向下查询");
            this.$set(itemLev1, "children", dataLev2);
            console.log("渲染完了二级");
            itemLev1.children.map((itemLev2, indexLev2) => {
              if (itemLev2.value == detailList[1]) {
                console.log("匹配到二级选中内容,开始查询三级");
                this.getTempData(3, itemLev2.value).then((dataLev3) => {
                  if (dataLev3 && dataLev3.length > 0) {
                    console.log("查询到了三级数据,即最末为三级");
                    this.$set(itemLev2, "children", dataLev3);
                    itemLev2.children.map((itemLev3, indexLev3) => {
                      console.log("末级添加标志位");
                      itemLev3.leaf = "leaf";
                    });
                  } else {
                    console.log("未查询到三级数据,即最末为二级");
                    itemLev2.leaf = "leaf";
                  }
                  console.log("渲染完了三级");
                  this.value = detailList;
                  this.num += 1;
                });
              }
            });
          } else {
            console.log("未查询到二级数据,即最末为一级");
            itemLev1.leaf = "leaf";
          }
          this.value = detailList;
          this.num += 1;
        });
      }
    });
  });
},
  • 执行渲染数据的方法 getDetail
级联请求到的数据 (2) [{…}, {…}]
渲染完了一级
匹配到一级选中内容,开始查询二级
级联请求到的数据 (3) [{…}, {…}, {…}]
查询到了二级数据,继续向下查询
渲染完了二级
匹配到二级选中内容,开始查询三级
级联请求到的数据 (3) [{…}, {…}, {…}]
查询到了三级数据,即最末为三级
末级添加标志位
渲染完了三级

渲染的过程

完整代码

<template>
  <div class="activeEnroll_list">
    <el-cascader
      v-model="value"
      :options="options"
      :props="props"
      :key="num"
      @change="chaangeFunc"
      ref="refHandle"
    ></el-cascader>
  </div>
</template>

<script>
export default {
  name: "activeEnroll_list",
  components: {},
  data() {
    return {
      num: 0,
      value: [],
      options: [
        // {
        //   label: "测试1",
        //   value: 1,
        //   children: [
        //     {
        //       label: "测试1-1",
        //       value: 11,
        //       children: [
        //         { label: "测试1-1-1", value: 111 },
        //         { label: "测试1-1-2", value: 112 },
        //         { label: "测试1-1-3", value: 113 },
        //       ],
        //     },
        //     { label: "测试1-2", value: 12 },
        //     { label: "测试1-3", value: 13 },
        //   ],
        // },
        // { label: "测试2", value: 2, children: [] },
      ],
      props: {
        checkStrictly: true, // 取消父节点与子节点的严格关联,可以任意选中任何一级作为结束
        lazy: true,
        lazyLoad: (node, resolve) => {
          let result = node.data;
          console.log("点击的节点数据", result);
          if (result) {
            if (result.level != 3) {
              this.getTempData(Number(result.level) + 1, result.value).then(
                (sourceData) => {
                  let data = [];
                  if (sourceData && sourceData.length > 0) {
                    data = sourceData;
                  }
                  resolve(data);
                }
              );
            } else {
              resolve([]);
            }
          } else {
          }
        },
      },
    };
  },

  created() {},

  mounted() {
    let flag = true; // flag 控制是执行新增还是编辑
    if (flag) {
      // 是编辑
      this.getDetail();
    } else {
      // 是新增
      this.getTempData(1).then((dataLev1) => {
        this.options = dataLev1;
      });
    }
  },

  watch: {},
  computed: {},

  methods: {
    chaangeFunc() {
      console.log("触发了change", this.value);
      // 选中节点后,关闭下拉
      this.$refs.refHandle.dropDownVisible = false;
    },
    // mock 接口数据
    getTempData(level, key) {
      return new Promise((resolve, reject) => {
        let result = [];
        if (level == 1) {
          result = [
            { label: "测试1", value: 1, level: 1 },
            { label: "测试2", value: 2, level: 1 },
          ];
        }
        if (level == 2) {
          if (key == 1) {
            result = [
              { label: "测试1-1", value: 11, level: 2 },
              { label: "测试1-2", value: 12, level: 2 },
              { label: "测试1-3", value: 13, level: 2 },
            ];
          }
        }
        if (level == 3) {
          if (key == 11) {
            result = [
              { label: "测试1-1-1", value: 111, level: 3 },
              { label: "测试1-1-2", value: 112, level: 3 },
              { label: "测试1-1-3", value: 113, level: 3 },
            ];
          }
        }
        setTimeout((item, index) => {
          console.log("级联请求到的数据", result);
          resolve(result);
        }, 1000);
      });
    },
    getDetail() {
      let detailList = [1, 11, 111]; // 模拟获取到的需要渲染的节点数据
      this.getTempData(1).then((dataLev1) => {
        this.options = dataLev1;
        console.log("渲染完了一级");
        this.options.map((itemLev1, indexLev1) => {
          if (itemLev1.value == detailList[0]) {
            console.log("匹配到一级选中内容,开始查询二级");
            this.getTempData(2, itemLev1.value).then((dataLev2) => {
              if (dataLev2 && dataLev2.length > 0) {
                console.log("查询到了二级数据,继续向下查询");
                this.$set(itemLev1, "children", dataLev2);
                console.log("渲染完了二级");
                itemLev1.children.map((itemLev2, indexLev2) => {
                  if (itemLev2.value == detailList[1]) {
                    console.log("匹配到二级选中内容,开始查询三级");
                    this.getTempData(3, itemLev2.value).then((dataLev3) => {
                      if (dataLev3 && dataLev3.length > 0) {
                        console.log("查询到了三级数据,即最末为三级");
                        this.$set(itemLev2, "children", dataLev3);
                        itemLev2.children.map((itemLev3, indexLev3) => {
                          console.log("末级添加标志位");
                          itemLev3.leaf = "leaf";
                        });
                      } else {
                        console.log("未查询到三级数据,即最末为二级");
                        itemLev2.leaf = "leaf";
                      }
                      console.log("渲染完了三级");
                      this.value = detailList;
                      this.num += 1;
                    });
                  }
                });
              } else {
                console.log("未查询到二级数据,即最末为一级");
                itemLev1.leaf = "leaf";
              }
              this.value = detailList;
              this.num += 1;
            });
          }
        });
      });
    },
  },
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为服务器驱动下载及安装

1.服务器技术支持网站 https://support.xfusion.com/support/#/zh/home 2.选择软件下载 3.选择服务器型号 4.选择驱动 5.根据需求选择驱动 例如红帽7.4系统 6.安装驱动 自动安装驱动步骤&#xff1a; 1)使用BMC虚拟光驱挂载onboard_driver_xxx.iso: 2)mount /dev/sr0 /mnt …

【vue3】ref , reactive ,toRef ,toRefs 使用和理解

这篇文章是基于理解写的&#xff0c;仅助于理解&#xff0c;如有任何错误之处&#xff0c;感谢指正&#xff01; 文章目录一.ref的使用1. ref的功能主要有两个&#xff1a;2.使用ref注意事项二.reactive的使用三.使用ref 和 reactive 实现双向数据绑定四.toRef 和 toRefs 的使用…

ARM uboot 源码分析7 - uboot的命令体系

一、uboot 命令体系基础 1、使用 uboot 命令 (1) uboot 启动后进入命令行环境下&#xff0c;在此输入命令按回车结束&#xff0c;uboot 会收取这个命令然后解析&#xff0c;然后执行。 2、uboot 命令体系实现代码在哪里 (1) uboot 命令体系的实现代码在 uboot/common/cmd_xx…

PA的包络跟踪电源

对于传统PA&#xff0c;电源一般设计成固定电压供电&#xff0c;电压不可变化。这种设计对于GSM和GPRS等使用恒定包络GMSK调制的系统来说&#xff0c;PA的效率是比较高的。 ​但随着追求更高的数据吞吐量以及更高的频谱效率&#xff0c;在现代的通信系统中使用了更复杂的调制方…

react定义css样式,使用less,css模块化

引入外部 css文件 import ./index.css此时引入的样式是全局样式 使用less 安装 npm i style-loader css-loader sass-loader node-sass -D生成config文件夹 npm run eject配置 以上代码运行完&#xff0c;会在根目录生成config文件夹 进入 config > webpack.config.js 查找…

基于jeecgboot的flowable为uniapp适配的流程页面调整

为了满足在uniapp上也能进行webview的流程页面操作与显示&#xff0c;需要对流程页面&#xff0c;特别是record/index.vue进行修改与适配。 一、对各个内容的宽带进行调整 主要是样式的调整 <el-col :span"16" :offset"4" 都修改成<el-col :span…

倾向得分匹配只看这篇就够了

一、倾向得分匹配法说明 倾向得分匹配模型是由Rosenbaum和Rubin在1983年提出的&#xff0c;首次运用在生物医药领域&#xff0c;后来被广泛运用在药物治疗、计量研究、政策实施评价等领域。倾向得分匹配模型主要用来解决非处理因素&#xff08;干扰因素&#xff09;的偏差。 …

协作对象死锁及其解决方案

协作对象死锁及其解决方案 1.前言 在遇到转账等的需要保证线程安全的情况时&#xff0c;我们通常会使用加锁的方式来保证线程安全&#xff0c;但如果无法合理的使用锁&#xff0c;很可能导致死锁。或者有时我们使用线程池来进行资源的使用&#xff0c;如调用数据库&#xff0…

Swagger狂神学习笔记

学习目标&#xff1a; 了解Swagger的概念及作用 掌握在项目中集成Swagger自动生成API文档 前后端分离 前端 -> 前端控制层、视图层 后端 -> 后端控制层、服务层、数据访问层 前后端通过API进行交互 前后端相对独立且松耦合 产生的问题 前后端集成&#xff0c;前端或…

支持U盘数据、误删文件、硬盘数据 、回收站数据恢复的软件

好用的Windows数据恢复软件的标准 在数字和信息经济时代&#xff0c;数据是必不可少的。没有人可以承受由于意外删除、格式化和其他原因导致数据丢失的风险。与其在数据恢复服务上花费大量资金或花费大量时间努力自己取回数据&#xff0c;用户更喜欢使用Windows数据恢复软件…

Ask林曦|来回答,30个你关心的日常问题(一)

在林曦老师的线上书法直播课上&#xff0c;上课前后的聊天时间里&#xff0c;时常有同学向林曦老师提问&#xff0c;这些问题涵盖了日常生活的诸多方面&#xff0c;从身体的保养&#xff0c;到快乐的法门&#xff0c;皆是大家感兴趣的&#xff0c;也都共同关切的。      暄…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…

git实战技巧-本地刚做出的修改、暂存和提交如何进行撤销

1、解决思路工作区和暂存区内容的撤销&#xff0c;直接按照对应命令或者IDEA界面完成操作就行。对于已提交的撤销回滚建议如下&#xff1a;1. 代码如果仅仅是回撤到指定版本&#xff0c;该版本之上的更新是不需要的&#xff0c;选择Hard模式。2. 代码回撤到指定版本时&#xff…

父传子与子传父步骤

父传子&#xff1a; 问题&#xff1a;父页面中引入子组件 把想要传给子页面的值用在子组件中用 &#xff1a;值“值” (用同一个值好区分)来绑定。 在子页面中用props接收 子组件不能改变父组件传过来的值。&#xff08;传多个页面的时候是&#xff0c;比如父传孙的时候我会…

2020蓝桥杯真题门牌制作(填空题) C语言/C++

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff…

两款全新模式——代言人、合伙人的玩法分享

近几年来&#xff0c;伴随着技术创新与时代发展趋势&#xff0c;线上消费订单配送服务高效率变得更加高&#xff0c;生活节奏的加快也使人们对于消费及时性越来越注重&#xff0c;及时要求已经大爆发。 用户的消费方式也发生了翻天覆地的变化&#xff0c;消费者跟商家不再是单…

jvm常识

Jvm工作原理学习笔记0126一、JVM的生命周期1.JVM实例对应了一个独立运行的java程序它是进程级别a)启动。启动一个Java程序时&#xff0c;一个JVM实例就产生了&#xff0c;任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点b)运行。ma…

Revit中如何使管道垂直连接及【支管升降】

一、Revit中如何使管道垂直连接 在管道的标高与所要相连的管子相差无几的时候&#xff0c;拉动管道所产生的管道连接方式往往不符合应有的设计思路&#xff0c;如图1所示&#xff1a; 1)相连之后所生成的一个布线方案&#xff0c;但不是我们所想要的布线方案。如图2所示&#x…

PPP点到点协议认证之PAP认证

PPP点到点协议认证之PAP认证 需求 如图配置接口的IP地址将R1配置为认证端&#xff0c;用户名和密码是 huawei/hcie &#xff0c;使用的认证方式是pap确保R1和R2之间可以互相ping通 拓扑图 配置思路 确保接口使用协议是PPP确保接口的IP地址配置正确在R1 的端口上&#xff0c…

【LeetCode】剑指 Offer 14- I. 剪绳子 p96 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/jian-sheng-zi-lcof/ 1. 题目介绍&#xff08;14- I. 剪绳子&#xff09; 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c…