layui treeTable 不支持 showSearch 配置,需手动实现搜索:递归过滤数据并 reload,同步 DOM 显示/隐藏与展开状态,高亮多列文本,加防抖和空值处理,注意分页与 cache 状态恢复。
treeTable 没有内置 showSearch,别白费劲配这个参数
layui treetable 组件(注意不是 tree)至今(2026 年 4 月)仍不支持 showsearch: true 配置。你写进去它不会渲染搜索框,也不会绑定事件——这不是你配置错,是它压根没实现。官方文档里没提,源码里也搜不到相关逻辑。强行加只会浪费调试时间。
手动搜索必须走 DOM + 数据双路过滤
treeTable 渲染后生成的是标准 table 结构,但节点间存在父子关系(靠 data-level、data-id、data-pid 等属性维持)。只隐藏不匹配的 tr 行会导致父子折叠状态错乱,所以得同步处理数据和视图:
- 先用递归函数遍历原始
data数组,提取所有「文本含关键词」的节点及其完整路径(父链 + 自身 + 所有后代) - 再基于该结果集,用
treeTable.reload({ data: filteredData })重载整棵树 —— 这是最稳的方式,避免 DOM 操作残留状态 - 若坚持 DOM 操作(比如想保留展开态),必须同时操作:
tr[data-id="xxx"]显示/隐藏 + 手动调用treeTable.expand(id, true/false)同步展开状态
搜索时高亮文本但不能破坏节点结构
直接在 td 里用 innerHTML.replace() 插入 <span class="highlight"></span> 是常见做法,但要注意:
- 高亮前先保存原始
textContent,否则多次搜索会把<span></span>当普通字符反复替换,HTML 越嵌越深 - 别只高亮第一列(如
title),要遍历每行所有td,否则“权限编码”“描述”等字段匹配不到 - 高亮样式用
background-color: #fff9c4比边框更安全,避免影响表格自适应宽度
输入防抖 + 空值清理是实际项目里的硬需求
用户连按或粘贴时,频繁触发 reload 会导致页面卡顿、接口重复请求(如果带 url)、甚至树结构闪烁。必须加防抖:
- 用
setTimeout+clearTimeout控制,延迟 300ms 再执行搜索 - 输入为空字符串时,立刻
treeTable.reload()恢复全量数据,而不是留着上次的过滤结果 - 如果 treeTable 启用了
page: true(分页),搜索时必须显式传page: { curr: 1 },否则可能显示空页
最易被忽略的一点:treeTable 的 cache 机制会缓存节点展开/选中状态。reload 后这些状态丢失,如果你依赖了 treeTable.checkStatus() 获取选中项,得在 reload 完成的 done 回调里重新 setChecked 或 restore 状态。











