解决el-tree节点过滤不显示下级的问题
作者:桃子Jerry 发布时间:2024-05-29 22:24:03
标签:el-tree,节点,过滤
显示下级的方法
elementui的节点过滤默认是不显示下级的
代码在 :filter-node-method="filterNode" 中添加
let parentNode = node.parent // 父级node
let labels = [node.label] // 当前node的名字
let level = 1 // 层级
while (level < node.level) {
labels = [...labels, parentNode.label] // 当前node名字,父级node的名字
parentNode = parentNode.parent
level++
}
return labels.some(d => d.indexOf(value) !== -1)
这样就可以完美解决了子节点可以展开的问题:
我们需求方觉得还可以再优化
当搜索 “春天” 的时候,父子级都能匹配到,这个时候子级的支线节点 “桃子” 也会显示出来:
当搜索 “苦” 的时候,父子级都能匹配到,这个时候子级的其它无关苦的节点需要隐藏
代码仍然在el-tree官方原生的 :filter-node-method="filterNode" 方法里面加
思路
一、(当前是支线节点,也就是说兄弟有匹配到的)并且 (支线节点所有下级都匹配不到关键字)的情况
二、隐藏支线节点,包括所有下级的子节点才行,光隐藏支线节点没有用
nodesParentId:[] 方法外的变量默认空数组
if (node.level > 1) {
// 把我和兄弟name整合到数组中
const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name)
// 判断兄弟有没有
if (info.some(d => d.indexOf(value) !== -1)) {
// 兄弟能匹配到,自己没有匹配到
if (data.name.indexOf(value) === -1) {
// 所有下级的 name 集合
const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map(
d => findTreeIdObjFn(this.dataTree, 'id', d).name
)
// 判断都没匹配到的情况
if (!names.some(d => d.indexOf(value) !== -1)) {
// 把我和我下级所有id push到变量中,将当前支线节点隐藏
this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id))
return false
}
}
}
}
// 如果当前节点在支线节点名单中,则隐藏当前节点
if (this.nodesParentId.indexOf(data.id) !== -1) {
return false
}
全部代码:
filterNode(value, data, node) {
// 校验没有数据情况
if (!value) {
this.nodesParentId = []
this.$nextTick(() => {
node.expanded = false
})
return true
}
// 控制展开和收起
this.$nextTick(() => {
node.expanded = false
})
// 当前名字是否包含在上级父亲里
if (data.name.indexOf(value) !== -1) {
this.$nextTick(() => {
this.openSuperior(node)
// 如果是第一级,直接打开当前级
if (!data.parentId) {
node.expanded = true
}
})
}
// 隐藏所有支线节点下面的所有子节点
// 思路:
// (当前是支线节点,兄弟有匹配到的情况)并且 (支线节点所有下级都匹配不到)的情况
// 隐藏支线节点,包括所有下级的子节点才行,光隐藏支线节点没有用
if (node.level > 1) {
// 把我和兄弟name整合到数组中
const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name)
// 判断兄弟有没有
if (info.some(d => d.indexOf(value) !== -1)) {
// 兄弟能匹配到,自己没有匹配到
if (data.name.indexOf(value) === -1) {
// 下级的 name 集合
const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map(
d => findTreeIdObjFn(this.dataTree, 'id', d).name
)
// 判断都没匹配到的情况
if (!names.some(d => d.indexOf(value) !== -1)) {
// 把我和我下级所有id push到变量中,将当前支线节点隐藏
this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id))
return false
}
}
}
}
// 当前节点在支线节点名单中,则隐藏当前节点
if (this.nodesParentId.indexOf(data.id) !== -1) {
return false
}
// 子级可被筛选到
let parentNode = node.parent // 父级node
let labels = [node.label] // 当前node的名字
let level = 1 // 层级
while (level < node.level) {
labels = [...labels, parentNode.label] // 当前node名字,父级node的名字
parentNode = parentNode.parent
level++
}
return labels.some(d => d.indexOf(value) !== -1)
// 总结:之前没解决的是因为 只隐藏支线父节点是隐藏不掉的,隐藏父节点包括下面的所有子节点才能隐藏
}
openSuperior 方法
// 展开所有父级
openSuperior(node) {
if (node.parent) {
node.parent.expanded = true
this.openSuperior(node.parent)
}
},
findTreeIdObjFn方法:
// 传入id(key)返回当前所在对象
/**
* @param {*} data 树形结构全部数据
* @param {*} key 查找的key
* @param {*} value 传入的key对应的value
* @returns
*/
export const findTreeIdObjFn = (data, key, value) => {
let temp = null
;(function fn(data, value) {
data.forEach(item => {
if (item[key] === value) {
temp = item
}
if (item.children && item.children.length > 0) {
fn(item.children, value)
}
})
})(data, value)
return temp
}
findCurNodeDescendantsFn方法:
// 找到传入tree数据当前节点的id及所有子孙的id(key)集合
/**
* @param {*} data tree数据
* @param {*} key 要查找的key
* @param {*} value key对应的value
* @returns
*/
export const findCurNodeDescendantsFn = (data, key, value) => {
const obj = findTreeIdObjFn(data, key, value)
const ids = []
;(function selfRunFn(obj) {
ids.push(obj[key])
if (obj.children && obj.children.length > 0) {
obj.children.forEach(x => {
selfRunFn(x)
})
}
})(obj)
return ids
}
来源:https://blog.csdn.net/jerryJJYY/article/details/123967538


猜你喜欢
- Ø 基本常用查询 --select select * from student; --all 查询所有 select
- 本文实例为大家分享了js实现弹幕特效的具体代码,供大家参考,具体内容如下此处使用HBuilder编译,最简单的弹幕效果,希望各位前辈不吝指教
- 如下: function checkAttachment(){ alert("here"); var attachmen
- 什么是缓存组件Cache缓存是提升 Web 应用性能简便有效的方式。 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省
- 前言本文旨在记录使用Flask框架过程中与前端Vue对接过程中,存在WebSocket总是连接失败导致前端取不到数据的问题。以及在使用Web
- 决策树是一种将数据集通过分割成小的、易于处理的子集来进行分类或回归的算法。其中每个节点代表一个用于划分数据的特征,每个叶子节点代表一个类别或
- 首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。在程序设计中,鸭子类型(英语:duck typing)
- 利用Python正则表达式匹配字符串中的http链接。主要难点是用正则表示出http 链接的模式。import repattern = re
- 作用:可以清空此文件所在的web站点所有文件,将文件内容清零.运行完毕所有文件大小都变成0字节.此代码本人原创,转载请注明转自本站,谢谢合作
- 大家好,我是辰哥。辰哥之前就想着Python可不可以剪辑视频(提取视频的音频,视频截取等等),然后辰哥在网上一搜,还真找到了Python的一
- 如下所示:INPUT = c_int * 4# 实例化一个长度为2的整型数组input = INPUT()# 为数组赋值(input这个数组
- 这几个技术都不是很新了,现在还拿出来说也就是为了教教新手了呵呵,各位大虾多多指正.css之所以出现就是为了实现数据与数据的表现形式的分离,
- --创建测试数据库 CREATE DATABASE Db GO --对数据库进行备份 BACKUP DATABASE Db TO DISK=
- jQuery的serialize模块中有个r20正则 var r20 = /%20/g, jQuery.param方法中会将所有的"
- 1.指向“开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外
- 如下所示:def translationCipher(msg,key): result = ["&quo
- Ranorex测试报告如何发送到邮箱在网上看了下,其实可以通过在Ranorex上或者VS调用编写发送邮箱代码就可以执行发送了,RX主要涉及到
- 1.定义在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象;再比如行星类,目前只有 8 个对象。这种实例有限且固定的类
- php 运算符与表达式一、运算符的分类1、按操作数分类1.!true // 一元运算符2.$a+$b // 二元运算符3.true ? 1:
- 观察一下”插入排序“:其实不难发现她有个缺点:如果当数据是”5, 4, 3, 2, 1“的时候,此时我们将“无序块”中的记录插入到“有序块”