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

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

需求:

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

image.png

开发

这个需求使用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、选择了子节点谁补全父节点?


(1)前端补全,那么Cascader需要返回二维数组,包含完整路径,后端返回也需要这个完整路径

不过,此时后端接收的值是一个一维数组,返回数据结构沟通后和options一样的层级结构


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


(2.1 如果后端在存储时自己添加父节点,数据回显的时候会出现父节点的值,数据变得不可控

(2.2 如果后端在筛选查询数据时自己通过子节点获取父节点,查询逻辑会变得复杂。


按照经验来说,数据的查询次数远远大于写次数

为了查询逻辑简单,只能在编辑时处理。


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


2、数据回显问题


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


后端返回一个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' ] 
]
 */


相关文章
|
8月前
|
前端开发 Java 关系型数据库
手办商城系统|Springboot+vue+ElementUI手办商城系统
手办商城系统|Springboot+vue+ElementUI手办商城系统
126 0
|
8月前
|
数据采集 前端开发 安全
基于Springboot+Vue+ElementUI实现疫情社区管理系统
基于Springboot+Vue+ElementUI实现疫情社区管理系统
|
3月前
vue3+Ts 二次封装ElementUI form表单
【10月更文挑战第8天】
279 59
|
3月前
|
JavaScript UED
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
【10月更文挑战第5天】本示例展示了如何在 Vue.js 中使用 Element UI 组件实现动态添加和删除嵌套表单项。该表单包含设备信息、设备部位及其对应的任务列表,支持用户动态添加设备部位和任务,并提供相应的表单验证规则。
287 0
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
|
3月前
|
JavaScript 前端开发
vue尚品汇商城项目-day06【vue插件-42.支付页面中使用ElementUI以及按需引入】
vue尚品汇商城项目-day06【vue插件-42.支付页面中使用ElementUI以及按需引入】
30 0
|
8月前
|
JavaScript 开发者 UED
Vue入门到关门之第三方框架elementui
ElementUI是一个基于Vue.js的组件库,包含丰富的UI组件如按钮、表格,强调易用性、响应式设计和可自定义主题。适用于快速构建现代化Web应用。官网:[Element.eleme.cn](https://element.eleme.cn/#/zh-CN)。安装使用时,需在项目中导入ElementUI和其样式文件。
81 0
|
5月前
|
JavaScript
基于Vue2+ElementUI/Vue3+ElementPlus对el-notification增加倒计时进度条特效,鼠标移入,暂停计时,鼠标移出,继续计时
本文介绍了如何在Vue2+ElementUI和Vue3+ElementPlus项目中对`el-notification`组件增加倒计时进度条特效,并实现鼠标移入通知时暂停计时,鼠标移出时继续计时的功能。
135 0
|
5月前
|
JavaScript 前端开发 数据库
vue+elementUi实现将数字转化为 对应的字符串内容
该博客文章介绍了如何在Vue框架结合Element UI组件库中,将数字状态字段转换为具体的字符串描述,并通过`el-table-column`展示在表格中。
vue+elementUi实现将数字转化为 对应的字符串内容
|
5月前
|
JavaScript
在vue中引入elementui
这篇文章介绍了如何在Vue项目中引入Element UI库,包括使用npm安装Element UI、在main.js文件中引入并注册,以及如何调用Element UI的组件。
|
7月前
|
分布式计算 资源调度 JavaScript
程序员必知:vue项目创建和启动、ElementUI的安装和快速学习
程序员必知:vue项目创建和启动、ElementUI的安装和快速学习
88 0

热门文章

最新文章