vue + elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数据,并设置组件el-cascader的默认值!

准备测试数据:方位、省、市区级联选择。

var list = [
{
parent: 0,
value: 1,
label: '东南',
children: [
{
parent: 1,
value: 2,
label: '上海',
children: [
{parent: 2, value: 3, label: '普陀'},
{parent: 2, value: 4, label: '黄埔'},
{parent: 2, value: 5, label: '徐汇'}
]
},
{
parent: 1,
value: 7,
label: '江苏',
children: [
{parent: 7, value: 8, label: '南京'},
{parent: 7, value: 9, label: '苏州'},
{parent: 7, value: 10, label: '无锡'}
]
},
{
parent: 1,
value: 12,
label: '浙江',
children: [
{parent: 12, value: 13, label: '杭州'},
{parent: 12, value: 14, label: '宁波'},
{parent: 12, value: 15, label: '嘉兴'}
]
}
]
},
{
parent: 0,
value: 17,
label: '西北',
children: [
{
parent: 17,
value: 18,
label: '陕西',
children: [
{parent: 18, value: 19, label: '西安'},
{parent: 18, value: 20, label: '延安'}
]
},
{
parent: 17,
value: 21,
label: '新疆维吾尔自治区',
children: [
{parent: 21, value: 22, label: '乌鲁木齐'},
{parent: 21, value: 23, label: '克拉玛依'}
]
}
]
}]

假设现在接口返回最后一级id数组是[13],表示选中杭州,需要根据id:13,找到所有父级id并组成数组 -> [1,12,13],(上面测试数据的value即id),具体方法如下:

/**
* 针对树形数据结构的级联选择器组件,后台数据返回最后一级数据id
* 封装处理方法,返回树形结构(注意此方法根据id返回对应结构的原始数据,根据不同场景,需再二次处理获得所需数据)
*
* @param list 级联选择器全部数据
* @param flagAttr 字段标识(id)
* @param values 接口最后一级id数组
* @param parentKey 树形数据中的父级id字段
* @param childrenKey 父级的子数据数组
*
* @return [treeData, ...]
* */
export function findParentLevel(list, flagAttr, values, parentKey = 'parent', childrenKey = 'children') {
if (!list || !list.length || !flagAttr || !Array.isArray(values)) return []
const longList = extractTree(list, childrenKey) // 展开树形数据
values = values.map(value => longList.find(item => item[flagAttr] === value)).filter(Boolean)
return makeTree(longList, parentKey, childrenKey, flagAttr, values) // 返回树形结构数据
}

extractTree:

/**
*
* @param {Array} arrs 树形数据
* @param {string} childs 树形数据子数据的属性名,常用'children'
* @param {Array} attrArr 需要提取的公共属性数组(默认是除了childs的全部属性)
* @returns
*/
export function extractTree(arrs, childs, attrArr) {
let attrList = []
if (!Array.isArray(arrs) && !arrs.length) return []
if (typeof childs !== 'string') return []
if (!Array.isArray(attrArr) || Array.isArray(attrArr) && !attrArr.length) {
attrList = Object.keys(arrs[0])
attrList.splice(attrList.indexOf(childs), 1)
} else {
attrList = attrArr
}
const list = []
const getObj = (arr) => {
arr.forEach(function(row) {
const obj = {}
attrList.forEach(item => {
obj[item] = row[item]
})
list.push(obj)
if (row[childs]) {
getObj(row[childs]) // 递归
}
})
return list
}
return getObj(arrs)
}

makeTree:

/**
* 组合树形数据结构
* @param data 平铺后的所有树形数据
* @param pid 父级id
* @param child 子数据数组字段
* @param id 子级id
* @param childrenArray 接口返回的子级数据
*
* @return [tree, ...]
* */
export function makeTree(data, pid, child, id, childrenArray) {
const parents = data.filter(p => p[pid] === 0)
childrenArray.forEach(item => {
makeLongList(item, item)
})
dataToTree(parents, childrenArray.map(i => i.longList || [i]).flat(1))
return parents.filter(item => item[child]) /**
* 递归向上寻找每一个子级数据对应的父级数据,并将所有父级数据放进接口返回子级数据的longList字段
* @param item1 接口返回的子级数据
* @param item2 向上寻找的父级数据, 顶级父级除外,上面已经获取到顶级数据
*
* */
function makeLongList(item1, item2) {
if (data.find(p => p[id] === item2[pid]) && data.find(p => p[id] === item2[pid])[pid]) {
if (item1.longList) {
item1.longList.push(data.find(p => p[id] === item2[pid]))
} else {
const it = JSON.parse(JSON.stringify(item1))
item1.longList = [it, data.find(p => p[id] === item2[pid])]
}
// 除去顶级数据
data.find(p => p[id] === item2[pid])[pid] && makeLongList(item1, data.find(p => p[id] === item2[pid]))
}
} function dataToTree(parents, children) {
parents.map(p => {
children.map((c, i) => {
if (c[pid] === p[id]) {
const _children = JSON.parse(JSON.stringify(children))
_children.splice(i, 1)
dataToTree([c], _children) // 递归
if (p[child]) {
p[child].push(c)
} else {
p[child] = [c]
}
}
})
})
}
}

效果展示:

图中未处理的数据就是根据最后一级id向上查找父级数据,处理后的数据是将找到的树形数据继续平铺处理成组件需要的各级id组成的数组(若业务场景固定,只需要id数据,那么在findParentLevel方法中可以直接返回处理后的数据)。

以上便是对el-cascader设置默认值的全部内容啦,希望对你有帮助~

脚踏实地行,海阔天空飞~

el-cascader组件根据最后一级向上找到父级并设置默认值的更多相关文章

  1. Vue 父组件传递给子组件,设置默认值为数组或者对象时

    在vue 父子组件传参过程中,传递对象或者数组时,设置默认值为{}或者[] 错误写法: props: { pos: { type: [Object, Array], default: []//这是错误 ...

  2. 给iview组件select设置默认值

    1.首先,给select加一个v-model,如: <Select v-model="exam_name" > <Option v-for="(item ...

  3. angular 父子组件传值 用get set 访问器设置默认值

    private _PLACEHOLDER: string; @Input() public set placeholder(v: string) { this._PLACEHOLDER = v; } ...

  4. VUE调用子窗口弹窗或组件弹窗,关闭弹窗刷新父级页面主页面,通过this.$emit来实现

    this.$emit是父级向自己传值 第一步在父级页面创建自己页面的引用 <template> <div> <edit ref="edit" @ref ...

  5. element 的 Cascader 级联选择器设定默认值

    Cascader 级联选择器 发现在很多的CRM管理系统里面,都有不少页面是用到这种级联选择器的,确实,功能很实用, 不过要设置默认值则应该让不少人头痛,因为你选择的时候 @change 事件的参数就 ...

  6. Vue组件库新增的prop属性类型是Object或者Array时默认值的设置

    在Vue开发中提供组件库时常常需要添加相关属性,用来接收父组件向子组件传递的数据,通常也会给属性设置默认值,那么当属性的类型是Object或者Array类型时如何设置默认值比较合理呢?下面将揭晓这一过 ...

  7. Cassandra二级索引原理——新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key,并且存储的值为原始数据的Primary Key,然后再通过pk一级索引找到真正的值

    1.什么是二级索引? 我们前面已经介绍过Cassandra之中有各种Key,比如Primary Key, Cluster Key 等等.如果您对这部分概念并不熟悉,可以参考之前的文章: [Cassan ...

  8. Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)

    Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...

  9. jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

    冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 下面是html代码部分: <body> <div id="content"> 外层div元素 ...

随机推荐

  1. 新一代大数据任务调度 - Apache DolphinScheduler喜提十大开源新锐项目 & 最具人气项目

    经 10000+ 开发者公开票选,20+专家评审. 10+ 主编团打分,历经数月打磨,11 月 19 日,由InfoQ 发起并组织的[2020中国技术力量年度榜单评选]结果正式揭晓. 2020 年度十 ...

  2. NC20242 [SCOI2005]最大子矩阵

    题目链接 题目 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大. 注意:选出的k个子矩阵 不能相互重叠. 输入描述 第一行为n,m,k(1 ≤ n ≤ 100 ...

  3. Gulp介绍及安装使用教程

    一.简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器,不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成,使用她,我们不仅可以很愉快的编写代码 ...

  4. async...await在tcp通讯中的正确用法

    引言 编程能力在不断的总结中进步以及成长,最近的半年里,对之前的开源项目代码进行回归,在重构的过程中进行了很多思考,很多次都想放弃重构,毕竟一个已经在使用的项目,重构基础代码就相当于重新开发了,不过最 ...

  5. DS队列----银行单队列多窗口模拟

    题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本 ...

  6. [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖

    主要考察了:源代码泄露.变量覆盖 共展示了三种获取flag的方式 1.打开题目查看未发现有效信息,查看源代码信息,发现返回的dog信息,结果如下: 2.使用dirmap进行目录扫描,发现了.git/c ...

  7. Oracle-查询之函数

    DQL语句:查询语句用于查询表中数据DQL必须包含的两个部分:select 子句 和from 子句select子句:指定要查询的内容,可以指定表中的具体字段,*号,函数,或者表达式from子句:指定数 ...

  8. HTML初学者小知识2

    网页内嵌 代码以及演示如下 代码 <div id="tab_1"> <iframe src="div.html" height="5 ...

  9. windows系统-不能打印问题:PDF打印软件正常打开PDF文件,点击打印后软件卡死并提示未响应(No response)

    电脑突然出现PDF软件卡死问题,导致无法打印:初步思路记录: 导致问题出现的原因可能为文件问题(文件过大,打印机容量小).打印机问题(打印机未连接.故障等).电脑驱动问题(打印机驱动损坏).电脑补丁问 ...

  10. window环境导入odbc数据源

    <ODBC指南>中只介绍了window环境如何配置odbc数据源,但是没有介绍如何导入数据源驱动,这里做个补充. 在没有导入数据源驱动之前,按照文档操作是查不到kingbaseES的odb ...