Vue:使用ElementUI, Cascader 级联选择器

举报
彭世瑜 发表于 2021/08/13 22:59:46 2021/08/13
【摘要】 需求: 多级分类支持多选选择子节点需要把父节点的值也选中,用于筛选时选中父节点也能筛出子节点分类可以无限级添加子节点 开发 这个需求使用ElementUI, Cascader 级联选择器 文档: https://element.eleme.cn/#/zh-CN/component/cascader 参数设置 // 筛选项 options:[ { valu...

需求:

  1. 多级分类
  2. 支持多选
  3. 选择子节点需要把父节点的值也选中,用于筛选时选中父节点也能筛出子节点
  4. 分类可以无限级添加子节点

在这里插入图片描述

开发

这个需求使用ElementUI, Cascader 级联选择器

文档: https://element.eleme.cn/#/zh-CN/component/cascader

参数设置

// 筛选项
options:[ { value: "1", label: "one", children: [ { value: "1-1", label: "one-one" } ]
}]

// 属性配置
props: { checkStrictly: true, // 父子关联 expandTrigger: 'hover', multiple: true, // 多选 emitPath: true // true 返回二维数组,false 返回一维数组
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

前后端交互问题

1、选择了子节点谁补全父节点?

(1)前端补全,那么Cascader需要返回二维数组,包含完整路径,后端返回也需要这个完整路径
不过,此时后端接收的值是一个一维数组,返回数据结构沟通后和options一样的层级结构

(2)后端补全,如果Cascader返回一个一维数组,只包含叶子节点,

(2.1 如果后端在存储时自己添加父节点,数据回显的时候会出现父节点的值,数据变得不可控
(2.2 如果后端在筛选查询数据时自己通过子节点获取父节点,查询逻辑会变得复杂。

按照经验来说,数据的查询次数远远大于写次数
为了查询逻辑简单,只能在编辑时处理。

综上,需要采用前端补全父节点的方式,需要Cascader返回一个完整路径的二维数组

2、数据回显问题

  1. 最简单的方式是后端增加一个冗余参数,按照Cascader返回的数据格式存储

  2. 后端返回一个options一样的层级结构

为了减少和后端的沟通,采用了后端返回一个options一样的层级结构

这样就需要递归的处理这个树形层级结构,代码如下

// 筛选项
let options = [
  { value: "1", label: "one", children: [ { value: "1-1", label: "one-one", children: [ { value: "1-1-1", label: "one-one-one" }, { value: "1-1-2", label: "one-one-two" }, ] }, { value: "1-1-2", label: "one-one-two", children: [ { value: "1-1-2-1", label: "one-one-two-one" }, { value: "1-1-2-2", label: "one-one-two-two" } ] } ]
  }
];

// 实现深拷贝
function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj));
}

// 节点递归添加到数组
function treeToArray(gloablList, option, parentList) {
  // 先将该节点的值和父节点的拷贝合并
  let copyList = deepCopy(parentList);
  copyList.push(option.value); // 如果该节点有子节点,递归处理;
  // 如果没有子节点,说明该节点是叶子节点,加入到全局list
  if (option.children) { for (let child of option.children) { treeToArray(gloablList, child, copyList); }
  } else { gloablList.push(copyList);
  }
}

// 处理列表
function treeTo2dArray(options) {
  // 定义一个全局列表,用于存放最后的值
  let gloablList = []; // 处理每一个节点
  for (let option of options) { treeToArray(gloablList, option, []);
  } return gloablList;
}

let ret = treeTo2dArray(options);
console.log(ret);

/**
[
  [ '1', '1-1', '1-1-1' ],
  [ '1', '1-1', '1-1-2' ],
  [ '1', '1-1-2', '1-1-2-1' ],
  [ '1', '1-1-2', '1-1-2-2' ] 
]
 */

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/113634900

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。