TDesign Tree组件展开子节点后父节点不自动展开怎么办?
在用TDesign的Tree组件做分类菜单时遇到个问题,当选中某个子节点时想让父节点自动展开,但用了setExpandedKeys和expand方法都没反应,父节点还是折叠着。我按照文档传了子节点的key进去,但好像必须手动展开父节点才行…
代码是这样写的:
const handleNodeSelect = (value) => {
const node = treeRef.current.getNode(value);
setExpandedKeys([value]); // 只展开当前节点
// 也试过treeInst.expand(node, true),但父节点没反应
};
节点数据结构没问题,父子关系都对,就是展开逻辑不联动。是不是要手动递归展开所有父节点?有没有现成的方法可以用?
试试这个方法:在设置expandedKeys的时候,得把从根节点到当前节点这条路径上的所有父节点key都塞进去。可以用getNode获取节点后往上递归找父级。
核心就是构建一个包含所有父级key的数组,然后一次性更新expandedKeys。注意unshift是为了保证顺序是从根开始的,不然可能中间某一级没展开导致后续失效。
如果你用了异步加载数据的情况,记得先确保父节点的数据已经加载完了再展开,不然也会失败。正常情况下这个写法是能跑通的。
常见的解决方案是:你需要手动把从根节点到目标子节点路径上的所有父节点key都收集起来,然后传给setExpandedKeys。组件本身没有提供自动展开所有父节点的功能,所以得自己写个递归方法遍历节点树,找到当前节点的祖先链,生成一个包含所有父节点key的数组。
举个例子你可以这样处理:
先写一个递归查找父节点链的方法:
然后在选中节点的时候调用它:
这个方法就是遍历整个树结构,找到当前节点到根节点的所有key。虽然有点麻烦,但这是目前TDesign Tree组件最稳妥的解决办法。确实要手动处理父子节点的展开联动,组件内部没有自动处理这个逻辑。