Layui tree 组件无直接获取半选节点的 API,需手动递归遍历 getData() 结果判断:节点有子节点且已勾选数大于 0 但小于子节点总数即为半选。
layui tree 没有直接获取半选节点的 API
layui 原生 tree 组件(非 treetable)不提供类似 gethalfchecked() 或 getindeterminate() 的方法。它的 getchecked() 只返回 checked: true 的节点,而“半选”状态(即父节点部分子项被勾选)仅用于视觉渲染,不作为独立可读取的状态字段暴露。
半选节点只能靠手动遍历 + 逻辑判断
要识别哪些节点处于半选状态,必须结合整棵树的数据结构做递归分析:检查每个节点是否有 children,再统计其子节点中真正被勾选的数量。满足“有子节点”且“已勾选数 > 0 但
- 必须先用
tree.getData('your-tree-id')拿到完整原始数据(不是getChecked()返回的子集) - 每个节点需含
id和children数组(children: []也要写,不能为null或缺失) - 递归函数需返回三元状态:
fully(全选)、partially(半选)、none(未选),仅当返回partially时才收集该节点id - 注意:顶层节点(无父级)也可能半选,不要只查 children 有值的节点
tree.getChecked() 返回结果不含半选标识
getChecked() 的返回值是纯节点对象数组,只包含 checked: true 的节点,字段里没有 indeterminate、LAY_CHECKBOX_HALF 或任何半选标记。网上搜到的 LAY_CHECKBOX_HALF 是 treeTable 模块内部使用的私有状态字段,在普通 tree 实例中并不存在,也不对外暴露。
- 错误做法:
tree.getChecked('xxx').filter(n => n.LAY_CHECKBOX_HALF)→ 返回空数组,因为根本没这个字段 - 正确路径:自己写递归函数,对
getData()结果做深度遍历 - 性能提醒:树很深或节点很多时,避免在
oncheck回调里实时计算——应节流后统一触发,或仅在提交前调用一次
别和 treeTable 的半选机制混淆
如果你实际用的是 treeTable(树形表格),那确实有 getHalfCheckedKeys() 方法,但它和 tree 是两个模块。混用会导致 undefined is not a function 错误。
- 确认你引入的是
layui.tree还是layui.treeTable - 检查 DOM 元素是否绑定了
treeTable.render()而非tree.render() - 调用
this.$refs.xxx或layui.treeTable相关 API 前,务必确认实例类型
getChecked() 会附带状态元信息,其实它连“是否是父节点”都不告诉你,所有逻辑都得自己补全。


















