layui tree 无原生 addNodes 方法,需维护 treeData 数组手动增删节点后调用 tree.render() 重绘;删除须递归过滤数据;checkbox 状态需配合 checkStatus/setChecked 同步;批量操作应合并 render。
layui tree 如何用 addNodes 动态添加节点
layui 的 tree 组件本身不提供原生的 addnodes 方法——这是常见误解的源头。你看到的 addnodes 通常是自己封装的逻辑,或来自非官方扩展。官方只支持初始化时传入 data,后续增删必须操作原始数据再重绘。
正确做法是:维护一份树结构数组(比如叫 treeData),手动 push 新节点,然后调用 tree.render() 重新渲染整棵树。
- 新节点必须带
id(唯一)、title(显示文本),建议加pid(父节点 id)便于定位层级 - 如果要加到某父节点下,先遍历
treeData找到该pid对应项,再往它的children数组里 push - 别直接改 DOM,layui tree 不响应式;改完数据后必须调用
tree.render({ elem: '#tree', data: treeData })
删除节点时为什么 splice 失效或漏删子节点
因为 layui tree 渲染后,DOM 节点和原始数据已脱钩。单纯从 DOM 上删 <li> 或用 jQuery 移除,下次 render() 会立刻恢复——它只认你传进去的 data 数组。
真正删除,得从源头数据下手:递归过滤掉目标节点及其所有后代,再重绘。
- 用
id做唯一标识,写个递归函数清空指定节点及全部children - 注意:如果节点有
children但没展开过,它在初始data中可能没被加载(懒加载模式),此时删的是空数组,得确认数据是否已完整加载 - 删完务必调用
tree.render(),否则界面不变
使用 showCheckbox: true 后,动态增删节点 checkbox 状态错乱
checkbox 状态由 layui 内部维护,不随你手动修改 data 自动同步。比如你删了一个已勾选的节点,但没同步清除其关联的勾选记录,再 render 就可能残留“半选”状态或勾选丢失。
根本解法是:每次操作节点前,先调用 tree.checkStatus() 拿当前勾选状态,操作完数据、重绘后,再用 tree.setChecked()(需自定义或 patch)或干脆重置勾选逻辑。
- layui 2.8+ 提供了
tree.setChecked(),但只接受id数组,且要求节点已在当前data中存在 - 更稳的方式:操作前缓存
tree.checkStatus().checked,删完节点后 filter 掉已不存在的 id,再用tree.setChecked(filteredIds) - 懒加载场景下,未加载子节点的 checkbox 状态不会出现在
checkStatus()结果里,这点容易漏判
性能隐患:频繁调用 tree.render() 导致卡顿
每次 tree.render() 都会清空容器、重建全部 DOM,100+ 节点时明显卡顿。尤其在循环添加多个节点时,逐个 render 是最差实践。
必须合并操作:一次性更新 treeData,最后只 render 一次。
- 避免在 for 循环里反复调用
tree.render() - 新增一批节点?先批量 push 到
treeData或对应children,再统一 render - 如果涉及大量增删,考虑用虚拟滚动或分页加载,layui tree 本身不支持虚拟列表,得自己截断数据
- 注意:
tree.render()第二个参数是完整数据,不是增量;别试图传 partial data










