解决el-tree节点过滤不显示下级的问题

作者:桃子Jerry 时间:2024-05-29 22:24:03 

显示下级的方法

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节点过滤不显示下级的问题

我们需求方觉得还可以再优化

当搜索 &ldquo;春天&rdquo; 的时候,父子级都能匹配到,这个时候子级的支线节点 &ldquo;桃子&rdquo; 也会显示出来:

解决el-tree节点过滤不显示下级的问题

当搜索 &ldquo;苦&rdquo; 的时候,父子级都能匹配到,这个时候子级的其它无关苦的节点需要隐藏

解决el-tree节点过滤不显示下级的问题

代码仍然在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

标签:el-tree,节点,过滤
0
投稿

猜你喜欢

  • javascript 文章截取部分无损html显示实现代码

    2024-04-19 09:57:11
  • Python操作lxml库实战之Xpath篇

    2023-12-26 23:08:00
  • python定时利用QQ邮件发送天气预报的实例

    2021-10-14 00:45:16
  • python数据处理之Pandas类型转换的实现

    2021-04-11 11:17:36
  • 栅格:一以贯之

    2008-07-22 12:19:00
  • 大家都来设计创意XP黑屏!

    2008-10-25 14:59:00
  • python实现感知器算法详解

    2022-04-29 15:08:43
  • Django一小时写出账号密码管理系统

    2023-03-19 23:42:02
  • PHP count()函数讲解

    2023-06-04 11:46:41
  • 无图片CSS圆角的五个实例

    2008-08-02 12:18:00
  • Python利用Selenium实现自动观看学习通视频

    2022-03-12 16:32:03
  • 详细总结Python常见的安全问题

    2022-04-22 14:19:20
  • SQL实现LeetCode(181.员工挣得比经理多)

    2024-01-17 03:15:01
  • MySQL 实例无法启动的问题分析及解决

    2024-01-21 10:50:06
  • Python线程同步的实现代码

    2022-10-01 00:20:48
  • 为ABP框架配置数据库

    2024-01-19 21:52:05
  • python因子分析的实例

    2021-12-29 18:20:44
  • Python代码实现http/https代理服务器的脚本

    2022-04-12 10:19:06
  • Python使用QRCode模块生成二维码实例详解

    2022-07-04 16:50:44
  • 新兴XML处理方法VTD-XML介绍

    2008-09-04 14:42:00
  • asp之家 网络编程 m.aspxhome.com