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

news/2024/4/26 10:24:34/文章来源:https://blog.csdn.net/weixin_42154189/article/details/129203337

需要实现的需求

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

实例解析

dom 元素

<el-cascaderv-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-cascaderv-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.luyixian.cn/news_show_73919.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核段页式内存管理技术

一、概述 1.虚拟地址空间 内存是通过指针寻址的&#xff0c;因而CPU的字长决定了CPU所能管理的地址空间的大小&#xff0c;该地址空间就被称为虚拟地址空间&#xff0c;因此32位CPU的虚拟地址空间大小为4G&#xff0c;这和实际的物理内存数量无关。 Linux内核将虚拟地址空间分…

五种IO模型以及select多路转接IO模型

目录 一、典型IO模型 1.1 阻塞IO 1.2 非阻塞IO 1.3 信号驱动I0 1.4 IO多路转接 1.5 异步IO 多路转接的作用和意义 二、多路转接IO模型&#xff08;select&#xff09; 2.1 接口 2.2 接口当中的事件集合&#xff1a; fd_set 2.2 select使用事件集合&#xff08;位图&am…

174万亿采购,奔向数字化

采购不单纯发生在外部&#xff0c;更发生在内部&#xff0c;只有两者同时进行&#xff0c;才能完成采购中心从成本到利润中心角色的转变。 作者|斗斗 编辑|皮爷 出品|产业家 数字化&#xff0c;让很多企业业务流程发生了质变。 《2022数字化采购发展报告》显示&#x…

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

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

无重叠区间-力扣435-java贪心策略

一、题目描述给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。示例 1:输入: intervals [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后&#xff0c;剩下的区间没有重叠。…

【爬虫】2.2 BeautifulSoup 装载HTML文档

HTML文档结点的查找工具很多&#xff0c;其中 BeautifulSoup 是功能强大且十分流行的查找工具之一。1. BeautifulSoup 的安装安装&#xff1a;pip install bs4导包&#xff1a;from bs4 import BeautifulSoup2. BeautifulSoup 装载HTML文档如果 doc 是一个 HTML 文档&#xff0…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪、rea…

18523-47-2,3-Azidopropionic Acid,叠氮基丙酸,可以与炔烃发生点击化学反应

【中文名称】3-叠氮基丙酸【英文名称】 3-Azidopropionic Acid&#xff0c;3-Azidopropionic COOH【结 构 式】【CAS】18523-47-2【分子式】C3H5N3O2【分子量】115.09【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g【是否接受定制】可进行定制&#xff0c;定制时…

java原理4:java的io网络模型

文章目录1&#xff1a;基础概念1&#xff1a;同步和异步2&#xff1a;阻塞和非阻塞2.1&#xff1a;阻塞IO2.2&#xff1a;非阻塞io2.3&#xff1a;io复用3&#xff1a;同步/异步和阻塞/非阻塞3.1&#xff1a;同步非阻塞NIO4: redis为什么速度快Java 网络IO模型简介1&#xff1a…

Tapdata 和 Databend 数仓数据同步实战

作者&#xff1a;韩山杰https://github.com/hantmacDatabend Cloud 研发工程师基础架构在云计算时代也发生着翻天地覆的变化&#xff0c;对于业务的支持变成了如何能利用好云资源实现降本增效&#xff0c;同时更好的支撑业务也成为新时代技术人员的挑战。 本篇文章通过&#xf…

删除MySQL表中的重复数据?

前言 一般我们将数据存储在MySQL数据库中&#xff0c;它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据&#xff0c;那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊&#xff0c;我还没有创建唯一索引捏&#xff0c;数据就重复了&…

jianzhiOffer第二版难重点记录

04. 二维数组中的查找https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 思路&#xff1a;可以每层用以恶搞二分查找&#xff0c;优化思路&#xff1a;从左下角出发直接用二分。 ​​​​​​07. 重建二叉树https://leetcode.cn/problems/zhong-jian-er-cha…

springboot+vue.js高校大学生选课成绩管理系统javaweb

本课题要求实现一套学生成绩管理系统&#xff0c;系统主要包括管理员&#xff0c;学生和教师三大模块 (a) 管理员&#xff1b;管理员进入系统主要功能包括首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;学生管理&#xff0c;公告信息管理&#xff0c;课程类型管理&…

Android自定义View实现横向的双水波纹进度条

效果图&#xff1a;网上垂直的水波纹进度条很多&#xff0c;但横向的很少&#xff0c;将垂直的水波纹改为水平的还遇到了些麻烦&#xff0c;现在完善后发布出来&#xff0c;希望遇到的人少躺点坑。思路分析整体效果可分为三个&#xff0c;绘制圆角背景和圆角矩形&#xff0c;绘…

Linux学习(7.5)linux目录配置与重点回顾

鸟哥的 Linux 私房菜 -- Linux 的文件权限与目录配置 (vbird.org) 怎么记啊&#xff0c;直接点进去看吧 目录 Linux目录配置的依据--FHS 绝对路径与相对路径 重点回顾 以下内容转载自鸟哥的Linux私房菜 Linux目录配置的依据--FHS 是希望让使用者可以了解到已安装软件通常…

16、变量、流程控制与游标

文章目录1 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量2 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决3 流程控制3.1 分支结构之 IF3…

嵌入式系统硬件设计与实践(学习方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 刚读书的时候&#xff0c;对什么是嵌入式&#xff0c;其实并不太清楚。等到自己知道的时候&#xff0c;已经毕业很多年了。另外对于计算机毕业的学…

Python近红外光谱分析与机器学习、深度学习方法融合实践技术

、 第一n入门基础【理论讲解与案 1、Python环境搭建&#xff08; 下载、安装与版本选择&#xff09;。 2、如何选择Python编辑器&#xff1f;&#xff08;IDLE、Notepad、PyCharm、Jupyter…&#xff09; 3、Python基础&#xff08;数据类型和变量、字符串和编码、list和tu…

每日学术速递2.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.BUAA_BIGSCity: Spatial-Temporal Graph Neural Network for Wind Power Forecasting in Baidu KDD CUP 2022 标题&#xff1a;BUAA_BIGSCity&#xff1a;百度KDD CUP 2022风电预测…