Tree组件搜索过滤功能如何实现


这篇文章主要介绍“Tree组件搜索过滤功能如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Tree组件搜索过滤功能如何实现”文章能帮助大家解决问题。树节点的搜索功能主要是为了方便用户能够快速查找到自己需要的节点。过滤功能不仅要满足搜索的特性,同时还需要隐藏掉与匹配节点同层级的其它未能匹配的节点。搜索功能主要包括以下功能:与搜索过滤字段匹配的节点需要进行标识,和普通节点进行区分子节点匹配时,其所有父节点需要展开,方便用户查看层级关系对于大数据量,采用虚拟滚动时,搜索过滤完成后滚动条需滚动至第一个匹配节点的位置搜索会将匹配到的节点高亮:过滤除了将匹配到的节点高亮之外,还会将不匹配的节点筛除掉:通过将节点与搜索字段相匹配的 label 部分文字进行高亮加粗的方式进行标记。易于用户一眼就能够找到搜索到的节点。通过添加searchTree方法,用户通过ref的方式进行调用。并通过option参数配置区分搜索、过滤。对于节点的获取及处理是搜索过滤功能的核心。尤其在大数据量的情况下,带来的性能消耗如何优化,将在实现原理中详情阐述。tree组件的文件结构:可以看出,vue3.0中 composition-api 带来的便利。逻辑层之间的分离,方便代码组织及后续问题的定位。能够让开发者只专心于自己的特性,非常有利于后期维护。添加文件use-search-filter.ts, 文件中定义searchTree方法。SearchFilterOption的接口定义,matchKeypattern的配置增添了搜索的匹配方式多样性。在tree.tsx主文件中添加文件use-search-fliter.ts的引用, 并将searchTree方法暴露给第三方调用者。nodes数据结构直接决定如何访问及处理匹配节点的父节点及兄弟节点在use-core.ts文件中可以看出, 整个数据结构采用的是扁平结构,并不是传统的树结构,所有的节点包含在一个一维的数组中。节点中添加以下属性,用于标识匹配关系通过 dealMatchedData 方法来处理所有节点关于搜索属性的设置。它主要做了以下事情:将用户传入的搜索字段进行大小写转换循环所有节点,先处理自身节点是否与搜索字段匹配,匹配就设置 selfMatched = true。首先判断用户是否通过自定义字段进行搜索 ( matchKey 参数),如果有,设置匹配属性为node中自定义属性,否则为默认 label 属性;然后判断是否进行正则匹配 ( pattern 参数),如果有,就进行正则匹配,否则为默认的忽略大小写的模糊匹配。如果自身节点匹配时, 设置节点 matchedText 属性值,用于高亮标识。判断自身节点有无 parentId,无此属性值时,为根节点,无须处理父节点。有此属性时,需要进行内层循环处理父节点的搜索属性。利用set保存节点的 parentId , 依次向前查找,找到parent节点,判读是否该parent节点被处理过,如果没有,设置父节点的 childrenMatchedexpanded 属性为true,再将parent节点的 parentId 属性加入set中,while循环重复这个操作,直到遇到第一个已经处理过的父节点或者直到根节点停止循环。整个双层循环将所有节点处理完毕。dealMatchedData核心代码如下:节点中添加以下属性,用于标识节点是否隐藏。同3.3中核心处理逻辑大同小异,通过双层循环, 节点的 isMatchedchildrenMatched 以及父节点的 isMatched 设置自身节点是否显示。核心代码如下:如果该节点被匹配,将节点的label处理成[preMatchedText, matchedText, postMatchedText]格式的数组。 matchedText添加 span标签包裹,通过CSS样式显示高亮效果。tree组件采用虚拟列表时,需将滚动条滚动至第一个匹配的节点,方便用户查看先得到目前整个树显示出来的节点,找到第一个匹配的节点下标。调用虚拟列表组件的 scrollTo 方法滚动至该匹配节点。通过 scrollTo 方法定位至第一个匹配项效果图:原始树结构显示图:过滤功能:到这里 Tree 组件的搜索过滤功能就开发完了,我们来使用下吧。是不是非常简单?searchTree 方法一共有两个参数:keyword 搜索关键字options 配置选项isFilter 是否需要过滤matchKey node节点中匹配搜索过滤的字段名pattern 搜索过滤时匹配的正则表达式整棵树数据结构就是一个一维数组,向上需要将匹配节点所有的父节点全部展开, 向下需要知道有没有子节点存在匹配。传统tree组件的数据结构是树形结构,通过递归的方式完成节点的访问及处理。对于扁平的数据结构应该如何处理?方案一:扁平数据结构 –> 树形结构 –> 递归处理 –> 扁平数据结构 (NO)方案二: node添加parent属性,保存该节点父级节点内容 –> 遍历节点处理自身节点及parent节点 (No)方案三: 同过双层循环,第一层循环处理当前节点,第二层循环处理父节点 (Yes)方案一:通过数据结构的转换处理,不仅丢掉了扁平数据结构的优势,还增加了数据格式转换的成本,并带来了更多的性能消耗。方案二:parent属性添加其实就是一种树形结构的模仿,增加内存消耗,保存很多无用重复数据。循环访问节点时也存在节点的重复访问。节点越靠后,重复访问越严重,无用的性能消耗。方案三: 利用扁平数据结构的优势,节点是有顺序的。即:树节点的显示顺序就是节点在数组中的顺序,父节点一定是在子节点之前。父节点访问处理只需要遍历该节点之前的节点,通过 childrenMatched属性标识该父节点有子节点存在匹配。 不用添加parent字段存取所有的父节点信息,不用通过数据转换,再递归寻找处理节点。外层循环,如果该节点没有匹配搜索字段,将不进行内层循环,直接跳过。 详见3.3中的代码通过对内层循环终止条件的优化,防止重复访问同一个父节点同样通过双层循环、以及处理匹配数据时增加的isMatchedchildrenMatched属性来共同决定节点的isHide属性,详见3.4中的代码、通过对内层循环终止条件的优化,与设置 childrenMatched免费云主机域名的判断有所区别。关于“Tree组件搜索过滤功能如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: php如何调用驾照题库

本篇内容主要讲解“php如何调用驾照题库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何调用驾照题库”吧!php调用驾照题库的方法:1、申请驾照题库API接口;2、配置申请的appkey;3、分析接口数据并…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/22 09:33
下一篇 03/22 09:33

相关推荐