必须用初始化时传入的扁平 treeData 数组通过 id/pid 反查父节点,obj.data.pid 仅为父 ID 而非父对象,Layui tree 不提供 node.parent 等引用属性。
直接用 obj.data.pid 拿不到父节点数据,只能拿到父 ID
点击事件回调里的 obj.data 只包含当前节点自身字段,pid 字段(如存在)仅是父节点的 id,不是父节点对象。想拿到父节点的 title、id、type 等完整信息,必须靠原始数据数组反查。
必须依赖初始化时传入的原始 treeData 数组
这是最关键的前置条件——你不能用 tree.getData() 或 obj.data.children 里嵌套的数据,它们是渲染快照,缺少全局层级关系。只有最初传给 tree.render({ data: yourTreeData }) 的那个数组才保有全部 id/pid 映射。
-
yourTreeData必须是扁平数组(非嵌套树结构),且每个节点含id和pid - 若用了
lazy: true,确保点击前顶层以下所有数据已加载完毕,否则pid对应的父节点可能还没拉下来 - 根节点的
pid常见值为0、null或undefined,判断时要按实际数据写current.pid !== 0 && current.pid != null
递归查找父节点的标准函数写法
下面这个函数能安全返回从根到当前节点的全部父级对象(不含当前节点),顺序是从根往叶子排:
function getParents(treeData, nodeId) {
const parents = [];
let current = treeData.find(n => n.id === nodeId);
while (current && current.pid !== 0 && current.pid != null) {
const parent = treeData.find(n => n.id === current.pid);
if (!parent) break;
parents.unshift(parent);
current = parent;
}
return parents;
}
在 click 回调中这样用:
tree.on('click', function(obj) {
const parentNodes = getParents(yourTreeData, obj.data.id);
console.log('直接父节点', parentNodes[parentNodes.length - 1]);
console.log('所有祖先节点', parentNodes);
});
多级嵌套时别误用 node.parent —— Layui tree 没这属性
有人会类比 Element UI 的 node.parent 写法,但在 Layui 中:obj.data 是纯数据对象,没有 parent、root 这类 DOM 或组件实例属性。试图访问 obj.data.parent 或 obj.data.children[0].parent 都会是 undefined。
- Layui tree 不维护节点间的引用关系,只靠
id/pid字段做逻辑关联 - 如果你看到别人代码里有
node.parent,那基本是自己封装的扩展,或混淆了 zTree / Element UI 的 API - 需要祖父节点?就调一次
getParents(),然后取parentNodes[parentNodes.length - 2](注意越界判断)
真正麻烦的不是写函数,而是确保 yourTreeData 在点击时刻是完整、一致、可索引的——尤其在权限菜单动态加载、多语言 title 替换后,容易把原始 id/pid 结构搞丢。











