手把手教你实现 Tree 组件搜索过滤功能

Java递归实现树结构遍历展示以及条件筛选 阅读详情

1 Tree 组件搜索过滤功能简介

树节点的搜索功能主要是为了方便用户能够快速查找到自己需要的节点。过滤功能不仅要满足搜索的特性,同时还需要隐藏掉与匹配节点同层级的其它未能匹配的节点。

搜索功能主要包括以下功能:

  1. 与搜索过滤字段匹配的节点需要进行标识,和普通节点进行区分
  2. 子节点匹配时,其所有父节点需要展开,方便用户查看层级关系
  3. 对于大数据量,采用虚拟滚动时,搜索过滤完成后滚动条需滚动至第一个匹配节点的位置

搜索会将匹配到的节点高亮:

过滤除了将匹配到的节点高亮之外,还会将不匹配的节点筛除掉:

2 组件交互逻辑分析

2.1 对于匹配节点的标识如何呈现?

通过将节点与搜索字段相匹配的 label 部分文字进行高亮加粗的方式进行标记。易于用户一眼就能够找到搜索到的节点。

2.2 用户如何调用 tree 组件的搜索过滤功能?

通过添加 searchTree 方法,用户通过ref的方式进行调用。并通过 option 参数配置区分搜索、过滤。

2.3 对于匹配的节点其父节点及兄弟节点如何获取及处理?

对于节点的获取及处理是搜索过滤功能的核心。尤其在大数据量的情况下,带来的性能消耗如何优化,将在实现原理中详情阐述。

3 实现原理和步骤

3.1 第一步:需要熟悉 tree 组件整个代码及逻辑组织方式

tree 组件的文件结构:

tree
├── index.ts
├── src
|  ├── components
|  |  ├── tree-node.tsx
|  |  ├── ...
|  ├── composables
|  |  ├── use-check.ts
|  |  ├── use-core.ts
|  |  ├── use-disable.ts
|  |  ├── use-merge-nodes.ts
|  |  ├── use-operate.ts
|  |  ├── use-select.ts
|  |  ├── use-toggle.ts
|  |  ├── ...
|  ├── tree.scss
|  ├── tree.tsx
└── __tests__
   └── tree.spec.ts

可以看出,vue3.0中 composition-api 带来的便利。逻辑层之间的分离,方便代码组织及后续问题的定位。能够让开发者只专心于自己的特性,非常有利于后期维护。

添加文件 use-search-filter.ts , 文件中定义 searchTree 方法。

import { Ref, ref } from 'vue';
import { trim } from 'lodash';
import { IInnerTreeNode, IUseCore, IUseSearchFilter, SearchFilterOption } from './use-tree-types';

export default function () {
  return function useSearchFilter(data: Ref<IInnerTreeNode[]>, core: IUseCore): IUseSearchFilter {
    const searchTree = (target: string, option: SearchFilterOption): void => {
      // 搜索主逻辑
    };

    return {
      virtualListRef,
      searchTree,
    };
  }
}

SearchFilterOption 的接口定义, matchKey 与 pattern 的配置增添了搜索的匹配方式多样性。

export interface SearchFilterOption {
  isFilter: boolean; // 是否是过滤节点
  matchKey?: string; // node节点中匹配搜索过滤的字段名
  pattern?: RegExp; // 搜索过滤时匹配的正则表达式
}

在 tree.tsx 主文件中添加文件 use-search-fliter.ts 的引用, 并将 searchTree 方法暴露给第三方调用者。

import useSearchFilter from './composables/use-search-filter';

  setup(props: TreeProps, context: SetupContext) {
    const userPlugins = [useSelect(), useOperate(), useMergeNodes(), useSearchFilter()];
    const treeFactory = useTree(data.value, userPlugins, context);
    expose({
      treeFactory,
    });
  }

3.2 第二步:需要熟悉 tree 组件整个nodes数据结构是怎样的。nodes数据结构直接决定如何访问及处理匹配节点的父节点及兄弟节点

在 use-core.ts 文件中可以看出, 整个数据结构采用的是扁平结构,并不是传统的树结构,所有的节点包含在一个一维的数组中。

const treeData = ref<IInnerTreeNode[]>(generateInnerTree(tree));
// 内部数据结构使用扁平结构
export interface IInnerTreeNode extends ITreeNode {
  level: number;
  idType?: 'random';
  parentId?: string;
  isLeaf?: boolean;
  parentChildNodeCount?: number;
  currentIndex?: number;
  loading?: boolean; // 节点是否显示加载中
  childNodeCount?: number; // 该节点的子节点的数量

  // 搜索过滤
  isMatched?: boolean; // 搜索过滤时是否匹配该节点
  childrenMatched?: boolean; // 搜索过滤时是否有子节点存在匹配
  isHide?: boolean; // 过滤后是否不显示该节点
  matchedText?: string; // 节点匹配的文字(需要高亮显示)
}

3.3 第三步: 处理匹配节点及其父节点的展开属性

节点中添加以下属性,用于标识匹配关系

isMatched?: boolean; // 搜索过滤时是否匹配该节点
  childrenMatched?: boolean; // 搜索过滤时是否有子节点存在匹配
  matchedText?: string; // 节点匹配的文字(需要高亮显示)

通过 dealMatchedData 方法来处理所有节点关于搜索属性的设置。

它主要做了以下事情:

  1. 将用户传入的搜索字段进行大小写转换
  2. 循环所有节点,先处理自身节点是否与搜索字段匹配,匹配就设置 selfMatched = true 。首先判断用户是否通过自定义字段进行搜索 ( matchKey 参数),如果有,设置匹配属性为node中自定义属性,否则为默认 label 属性;然后判断是否进行正则匹配 ( pattern 参数),如果有,就进行正则匹配,否则为默认的忽略大小写的模糊匹配。
  3. 如果自身节点匹配时, 设置节点 matchedText 属性值,用于高亮标识。
  4. 判断自身节点有无 parentId ,无此属性值时,为根节点,无须处理父节点。有此属性时,需要进行内层循环处理父节点的搜索属性。利用set保存节点的 parentId , 依次向前查找,找到parent节点,判读是否该parent节点被处理过,如果没有,设置父节点的 childrenMatched 和 expanded 属性为true,再将parent节点的 parentId 属性加入set中,while循环重复这个操作,直到遇到第一个已经处理过的父节点或者直到根节点停止循环。
  5. 整个双层循环将所有节点处理完毕。

dealMatchedData 核心代码如下:

const dealMatchedData = (target: string, matchKey: string | undefined, pattern: RegExp | undefined) => {
    const trimmedTarget = trim(target).toLocaleLowerCase();
    for (let i = 0; i < data.value.length; i++) {
        const key = matchKey ? data.value[i][matchKey] : data.value[i].label;
        const selfMatched = pattern ? pattern.test(key) : key.toLocaleLowerCase().includes(trimmedTarget);
        data.value[i].isMatched = selfMatched;
        // 需要向前找父节点,处理父节点的childrenMatched、expand参数(子节点匹配到时,父节点需要展开)
        if (selfMatched) {
            data.value[i].matchedText = matchKey ? data.value[i].label : trimmedTarget;
            if (!data.value[i].parentId) {
                // 没有parentId表示时根节点,不需要再向前遍历
                continue;
            }
            let L = i - 1;
            const set = new Set();
            set.add(data.value[i].parentId);
            // 没有parentId时,表示此节点的纵向parent已访问完毕
            // 没有父节点被处理过,表示时第一次向上处理当前纵向父节点
            while (L >= 0 && data.value[L].parentId && !hasDealParentNode(L, i, set)) {
                if (set.has(data.value[L].id)) {
                    data.value[L].childrenMatched = true;
                    data.value[L].expanded = true;
                    set.add(data.value[L].parentId);
                }
                L--;
            }
            // 循环结束时需要额外处理根节点一层
            if (L >= 0 && !data.value[L].parentId && set.has(data.value[L].id)) {
                data.value[L].childrenMatched = true;
                data.value[L].expanded = true;
            }
        }
    }
};

const hasDealParentNode = (pre: number, cur: number, parentIdSet: Set<unknown>) => {
    // 当访问到同一层级前已经有匹配时前一个已经处理过父节点了,不需要继续访问
    // 当访问到第一父节点的childrenMatched为true的时,不再需要向上寻找,防止重复访问
    return (
    (data.value[pre].parentId === data.value[cur].parentId && data.value[pre].isMatched) ||
    (parentIdSet.has(data.value[pre].id) && data.value[pre].childrenMatched)
    );
};

3.4 第四步: 如果是过滤功能时,需要将未匹配到的节点进行隐藏

节点中添加以下属性,用于标识节点是否隐藏。

isHide?: boolean; // 过滤后是否不显示该节点

同3.3中核心处理逻辑大同小异,通过双层循环, 节点的 isMatched 和 childrenMatched 以及父节点的 isMatched 设置自身节点是否显示。

核心代码如下:

const dealNodeHideProperty = () => {
  data.value.forEach((item, index) => {
    if (item.isMatched || item.childrenMatched) {
      item.isHide = false;
    } else {
      // 需要判断是否有父节点有匹配
      if (!item.parentId) {
        item.isHide = true;
        return;
      }
      let L = index - 1;
      const set = new Set();
      set.add(data.value[index].parentId);
      while (L >= 0 && data.value[L].parentId && !hasParentNodeMatched(L, index, set)) {
        if (set.has(data.value[L].id)) {
          set.add(data.value[L].parentId);
        }
        L--;
      }
      if (!data.value[L].parentId && !data.value[L].isMatched) {
        // 没有parentId, 说明已经访问到当前节点所在的根节点
        item.isHide = true;
      } else {
        item.isHide = false;
      }
    }
  });
};

const hasParentNodeMatched = (pre: number, cur: number, parentIdSet: Set<unknown>) => {
    return parentIdSet.has(data.value[pre].id) && data.value[pre].isMatched;
};

3.5 第五步:处理匹配节点的高亮显示

如果该节点被匹配,将节点的 label 处理成 [preMatchedText, matchedText, postMatchedText] 格式的数组。 matchedText 添加 span 标签包裹,通过CSS样式显示高亮效果。

const matchedContents = computed(() => {
    const matchItem = data.value?.matchedText || '';
    const label = data.value?.label || '';
    const reg = (str: string) => str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    const regExp = new RegExp('(' + reg(matchItem) + ')', 'gi');
    return label.split(regExp);
});
<span class={nodeTitleClass.value}>
    { !data.value?.matchedText && data.value?.label }
    {
      data.value?.matchedText
      && matchedContents.value.map((item: string, index: number) => (
        index % 2 === 0
        ? item
        : <span class={highlightCls}>{item}</span>
      ))
    }
</span>

3.6 第六步:tree组件采用虚拟列表时,需将滚动条滚动至第一个匹配的节点,方便用户查看

先得到目前整个树显示出来的节点,找到第一个匹配的节点下标。调用虚拟列表组件的 scrollTo 方法滚动至该匹配节点。

const getFirstMatchIndex = (): number => {
  let index = 0;
  const showTreeData = getExpendedTree().value;
  while (index <= showTreeData.length - 1 && !showTreeData[index].isMatched) {
      index++;
  }
  return index >= showTreeData.length ? 0 : index;
};

const scrollIndex = getFirstMatchIndex();
virtualListRef.value.scrollTo(scrollIndex);

通过 scrollTo 方法定位至第一个匹配项效果图:

原始树结构显示图:

过滤功能:

4 遇到的难点问题

4.1 搜索的核心在于对匹配节点的所有父节点的访问以及处理

整棵树数据结构就是一个一维数组,向上需要将匹配节点所有的父节点全部展开, 向下需要知道有没有子节点存在匹配。传统 tree 组件的数据结构是树形结构,通过递归的方式完成节点的访问及处理。对于扁平的数据结构应该如何处理?

  • 方案一:扁平数据结构 --> 树形结构 --> 递归处理 --> 扁平数据结构 (NO)
  • 方案二: node添加parent属性,保存该节点父级节点内容 --> 遍历节点处理自身节点及parent节点 (No)
  • 方案三: 同过双层循环,第一层循环处理当前节点,第二层循环处理父节点 (Yes)

方案一:通过数据结构的转换处理,不仅丢掉了扁平数据结构的优势,还增加了数据格式转换的成本,并带来了更多的性能消耗。

方案二:parent属性添加其实就是一种树形结构的模仿,增加内存消耗,保存很多无用重复数据。循环访问节点时也存在节点的重复访问。节点越靠后,重复访问越严重,无用的性能消耗。

方案三: 利用扁平数据结构的优势,节点是有顺序的。即:树节点的显示顺序就是节点在数组中的顺序,父节点一定是在子节点之前。父节点访问处理只需要遍历该节点之前的节点,通过 childrenMatched 属性标识该父节点有子节点存在匹配。 不用添加parent字段存取所有的父节点信息,不用通过数据转换,再递归寻找处理节点。

4.2 处理父级节点时进行优化,防止内层遍历重复处理已经访问过的父级节点,带来性能提升

外层循环,如果该节点没有匹配搜索字段,将不进行内层循环,直接跳过。 详见3.3中的代码

通过对内层循环终止条件的优化,防止重复访问同一个父节点

let L = index - 1;
const set = new Set();
set.add(data.value[index].parentId);
while (L >= 0 && data.value[L].parentId && !hasParentNodeMatched(L, index, set)) {
    if (set.has(data.value[L].id)) {
        set.add(data.value[L].parentId);
    }
    L--;
}
const hasDealParentNode = (pre: number, cur: number, parentIdSet: Set<unknown>) => {
    // 当访问到同一层级前已经有匹配时前一个已经处理过父节点了,不需要继续访问
    // 当访问到第一父节点的childrenMatched为true的时,不再需要向上寻找,防止重复访问
    return (
    (data.value[pre].parentId === data.value[cur].parentId && data.value[pre].isMatched) ||
    (parentIdSet.has(data.value[pre].id) && data.value[pre].childrenMatched)
    );
};

4.3 对于过滤功能,还需处理节点的显示隐藏

同样通过双层循环、以及处理匹配数据时增加的 isMatched 、 childrenMatched 属性来共同决定节点的 isHide 属性,详见3.4中的代码、

通过对内层循环终止条件的优化,与设置 childrenMatched 时的判断有所区别。

const hasParentNodeMatched = (pre: number, cur: number, parentIdSet: Set<unknown>) => {
    return parentIdSet.has(data.value[pre].id) && data.value[pre].isMatched;
};

5 小结

虽然是一个组件下一个小特性的开发,但是从特性的交互分析开始,一步步到最终的功能实现,整个过程还是收获满满。平时开发中很少能够从方案设计到功能实现有一个整体的规划,往往都是先上手代码,在开发过程中才发现方案选取不合理,就会走很多弯路。所以,刚开始的特性分析和方案设计就显得尤为重要。

分析 --> 设计 --> 方案探讨 --> 方案确定 --> 功能实现 --> 逻辑优化。每个过程都能锻炼提升自己的能力。

最好用的 7 个 Vue Tree select 树形组件 - 卡拉云 Vue 树形选择器(Vue tree select)组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构外,还有非常多样的功能来配合不同场景的使用。比如搜索过滤,前端添加删除树枝,前端编辑修改子树名,拖拽排序,对用户操作事件记录等。本文记录了我自己使用多年最好用的 7 款 Vue tree select 组件,每一款都经过我实际测试,推荐给大家。 阅读详情

相关推荐

手把手教你解决el-tree搜索过滤不更新的问题(含滚动条场景处理)

本文详细解析了el-tree组件在添加横向滚动条时搜索过滤功能失效的问题,提供了从基础到进阶的多种解决方案。通过分析CSS样式冲突根源,给出移除冲突属性、使用弹性布局等实用技巧,并附赠完整实现代码示例,帮助开发者快速解决树形节点过滤不更新的技术难题。

weixin_29210759的博客 583

树型数据筛选实现方案-Java

1、人员根据身份的不同对部门有不同的权限。1、根据条件,标注好每个节点的权限信息。3、递归数据,删除不需要展示的节点。2、前端请求对树节点进行筛选。

MinisterOL的博客 900

记录基于Vue.js的移动端Tree树形组件

Vue 树形选择器( Vue tree select )组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构外,还有非常多样的功能来配合不同场景的使用。比如搜索过滤,前端添加删除树枝,前端编辑修改子树名,拖拽排序,对用户操作事件记录等。本文记录了我自己使用多年最好用的 2款 Vue tree select 组件,每一款都经过我实际测试,推荐给大家。

Mr.小灰狼_随笔 1万+

java 通用树_具有节点过滤的Java通用树遍历

回答(4)2 years ago我建议你尝试以下方法:方法 boolean removeRecursively(String id, Set leavesToKeep) 将从具有给定 id 的节点遍历到此分支离开 .首先,我们检查一下是不是一个叶子 . 如果叶子不在 leavesToKeep 集合中,我们将其删除并返回 true ,否则返回 false . 这是我们递归的基本情况 .如果节点不是...

weixin_34942785的博客 1201

vue3+ant design vue 实现Tree树形控件带搜索库并可关键字搜索筛选功能,Antd组件库a-tree可搜索的树展示搜索结果并展开(根据关键字搜索过滤tree树列表数据,详细示例代码)

Vue3 AntDesign可搜索的树(只展示搜索结果并展开)vue3+antd使用andt-tree实现可搜索的tree_antd选择树搜索,vue3项目Antd 实现Tree树形控件带搜索功能,支持搜索展开tree,antd-tree组件带搜索框,Ant Design Vue3组件Tree树形控件,Tree组件实现可搜索的树,ant.design组件库中的Tree组件实现可搜索的树,树控件的搜索功能,antd Tree 组件 带搜索,动态list数据,tree嵌套数据,搜索后关键字标红,具备搜索功能的树

✅ 精选推荐文章 5267

java-根据过滤条件显示树形结构

java根据过滤条件显示树形结构,其中包括所需要的jar包

修改element ui tree 搜索功能,实现分级搜索,关键字高亮

element ui 里面的tree 自带的搜索功能是默认搜索的全部数据,有关键字的显示,没有的不显示 需求: 在element UI tree 原有功能不变的情况下新加 1)搜索 tree 时,如果非叶子节点里面含有关键字,那么就显示此节点下的所有节点,此节点下的所有节点不参与过滤; 2)所有节点里面含有的关键字都高亮 效果如下: 实现: 1)修改插件自带的 filterNod...

qq_40247562的博客 6157

图像相似度的评价指标 : FID(Fréchet Inception Distance)

FID(Fréchet Inception Distance) 是用来计算真实图像与生成图像的特征向量间距离的一种度量。如果FID值越小,则相似程度越高。最好情况即是FID=0,两个图像相同。 实际计算: 参考链接:https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/ # example of calculating the frechet inceptio

weixin_43723625的博客 1万+

LayUI Tree 组件扩展实现(搜索功能,复选框,自定义节点图标,右击菜单)(附带源码)

最近项目选项前端技术选型选择了LayUI,没选到的是tree组件的功能实在太弱了,没办了,只能自己修改了源码,目前实现了以下功能,github还没有时间更新敬请期待。那我们来看看扩展功能吧: 一、扩展功能 1,增加了目录树的搜索功能 2,增加了目录树的复选框和事件回调的实现 3,增加了根节点图标和叶子图标自定义设置。 4,增加右键菜单和事件回调。 让我妈看一下效果图吧 搜索功能效果...

qq_27532167的博客 1万+

SAP中贸易伙伴的应用原理简析

公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 9817

DDR内存Prefetch机制详解:从DDR1到DDR4的技术演进与性能提升

本文深入解析DDR内存Prefetch机制从DDR1到DDR4的技术演进与性能提升。通过分析Prefetch技术的实现原理与Burst传输的协同机制,揭示DDR1的2n Prefetch、DDR2的4n Prefetch、DDR3的8n Prefetch以及DDR4的Bank Group架构创新如何显著提升内存带宽与系统性能。

weixin_30369041的博客 540

layui的tree 搜索功能

部分代码: var value = $(".search-input").val(); if(value){ $.each($("#depart").find('.layui-tree-txt'), function (index, elem) { elem = $(elem); let textTemp = elem.text();

qq_40113688的博客 1261

CST STUDIO SUITE 2023安装

破解工具的Crack文件夹内有一个名为「CST Studio Suite 2022」的文件夹,这也是于CST的安装目录同名的文件夹,直接把它拷贝到CST Studio Suite 2022的同级路径下即可,比如你的CST安装路径为:D:\Program Files\CST Studio Suite 2022,则将Crack目录内的「CST Studio Suite 2022」文件夹复制到 D:\Program Files\ 这个级别的路径下即可。软件百度网盘链接放在文章末尾啦!先不着急启动CST或者激活。

m0_49516223的博客 4130

vxe-tree 树组件实现关键字搜索

本文介绍了使用vxe-tree树组件实现关键字搜索功能的方法。通过vxe-input输入框获取搜索内容,利用XEUtils工具库的searchTree方法对树形数据进行过滤筛选,并将匹配结果高亮显示。代码实现了500毫秒节流搜索、自动展开/折叠节点以及关键词高亮样式等功能。主要包含:1)基础树形数据结构;2)搜索过滤逻辑;3)节流优化处理;4)搜索结果高亮展示。该方案可快速为vxe-tree组件添加高效的搜索功能,提升用户交互体验。

我的博客 592

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 267

Lama:基于傅立叶卷积的分辨率鲁棒性大掩模修复

为了缓解修复网络和损失函数都缺乏有效的感受野这个问题,提出了大掩模修复(LaMa)。LaMa基于一种新的修复网络架构,该架构使用快速傅立叶卷积(FFC),具有图像范围的感受野;高感受野感知损失;大型训练掩码,释放前两个组件的潜力。

qq_44926214的博客 1418

vue中基于iview封装支持搜索选中的Tree组件

vue中基于iview封装支持搜索选中的Tree组件

苏苏就是小苏苏的博客 2546

数据库小技能:数据导入脚本

背景:版本大升级,从2.0升级到3.0 ,服务端开发语言从c#换到java语言。数据库类型从microsalft sql server 换到mysql。数据来源于微信,用于查询卡bin。

专注于计算机研发知识和资讯分享 774

antd Tree 组件 带搜索

前言: antd Tree组件带搜索,官网示例感觉很麻烦,不容易让人懂,我就自己实现了一个。 antd 3.xTree带搜索(官网示例) antd 4.x Tree带搜索(官网示例) 实现代码: 一、这个是搜索到后,包含字符标红 import React, { Component } from 'react'; import { Form, Input, Tree } from 'antd'; const TreeNode=Tree.TreeNode; const { Search } = I

从事前端,不断积累经验,学习新的技术。头像不是本人是莉莉崽(美貌、可爱集于一身的小姐姐,小仙女),一个宝藏博主,值得喜欢! 5434

基于单光子探测的高重频多通道符合测距

TDC专栏之基于单光子探测的高重频多通道符合测距

sdau2005的博客 1205

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

elementu的tree过滤搜索_element-ui中el-tree组件的节点过滤中的关键字高亮实现

angular.js、react.js、vue.js现在前端主流的三大框架中,从17年开始又以vue最为火爆。而三大框架更多的偏向于js交互层面,而在ui层面里呢,饿了么外卖的那个element-ui是使用vue时组件覆盖面较为全面的了。目前在用到便签时,发现了原生并没有支持高亮检索词属性。而树形结构在查找东西时,对于不太熟悉的人来说确实不太友好。所以,就简单通过jquery简陋的做了个动态高亮显...

weixin_39777497的博客 867

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

elementu的tree过滤搜索_elementui tree 节点过滤加载对应子节点

element-ui tree 节点过滤加载对应子节点方法,官网例子,不会返回过滤节点的子节点,这也是总结这篇博客的原因。//官网例子placeholder="输入关键字进行过滤"v-model="filterText">class="filter-tree":data="data2":props="defaultProps"default-expand-all:filter-node-me...

weixin_39661589的博客 576

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts,这段代码中使用了`Search`组件,通过`placeholder`属性设置了一个提示文本`Search`,并通过`onChange`属性指定了一个事件处理函数`onChange`来处理搜索框的值变化事件。

wbskb的博客 3349

7个最好用的Vue Tree Select树形组件

Vue 树形选择器(Vue tree select)组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构外,还有非常多样的功能来配合不同场景的使用。比如搜索过滤,前端添加删除树枝,前端编辑修改子树名,拖拽排序,对用户操作事件记录等。 Vue JSTree - 全功能,树状单选多选,可拖拽,过滤搜索 Vue Draggable Nested Tree - 纯树形选择,轻盈趁手 Vue Tree List Component - 前端可编辑、删除,拖拽,界面友好

weixin_57726973的博客 9029

3分钟实现树形搜索:Layui树组件高效过滤方案

你是否还在为海量树形节点查找发愁?当部门层级嵌套过深、商品分类多达数百项时,逐条展开寻找目标节点如同大海捞针。本文将基于Layui的tree组件,通过3个步骤实现高性能树形搜索功能,让用户在毫秒级响应中精准定位所需节点。 ## 实现原理:数据过滤与节点控制 树形搜索的核心在于**动态筛选数据源**并**控制节点展开状态**。Layui的tree组件虽未直接提供搜索API,但通过`tree.re...

gitblog_00029的博客 466
上一篇: 从Mybatis源码中,学习到的10种设计模式
下一篇: Shopee在React Native 架构方面的探索
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值