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

需求:

  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、选择了子节点谁补全父节点?

(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' ] 
]
 */
ElementUI 中的城市级联选择器是一个非常常用的组件,可以帮助用户在一个区域选择省、市和区县。要使用城市级联选择器,你需要按照以下步骤进行设置: 1. 安装 ElementUI:首先确保你已经安装了 ElementUI,可以通过 npm 或者 yarn 进行安装。 2. 引入级联选择器组件:在你的项目中找到需要使用城市级联选择器的页面或组件,并在该页面或组件中引入级联选择器组件。在 Vue 文件中,可以使用 import 语句引入: ```javascript import { Cascader } from 'element-ui'; ``` 3. 使用级联选择器组件:在你的页面或组件中使用 Cascader 组件,并为其绑定相应的数据和事件处理方法。 ```html <template> <cascader :options="options" :props="props" v-model="selectedCity" @change="handleCityChange" ></cascader> </template> <script> export default { data() { return { options: [], // 城市数据源 props: { value: 'value', label: 'label', children: 'children', }, selectedCity: [], // 选中的城市 }; }, methods: { handleCityChange(value) { console.log('选中的城市:', value); }, }, }; </script> ``` 4. 加载城市数据源:在获取城市数据源的方法中,将数据源赋值给 options 变量,以便级联选择器组件能够正确显示和选择城市。 ```javascript import cityData from './cityData'; // 城市数据源 // ... data() { return { options: cityData, // 城市数据源 // ... }; }, ``` 5. 自定义城市数据源:你可以根据需要自定义城市数据源,以适应你的项目要求。 以上是使用 ElementUI 的城市级联选择器的基本设置步骤。你可以根据自己的需求进行相应的样式和逻辑定制。希望对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值