TDesign Tree如何在节点展开时动态加载子节点数据?
在用TDesign的Tree组件做权限配置时,想实现展开节点才加载子节点数据。按照文档设置了lazy和onExpand,但展开后子节点没显示,控制台也没报错。
代码是这样写的:
import { Tree } from 'tdesign-react';
const TreeNode = ({ node }) => {
const handleExpand = () => {
// 模拟异步请求
setTimeout(() => {
node.expand(); // 这里是不是有问题?
node.appendChildren([{ label: '新节点' }]);
}, 500);
};
return (
<Tree
lazy
onExpand={handleExpand}
nodes={initialNodes}
/>
);
};
数据结构没问题,初始节点能显示,展开时函数也执行了,但新节点就是不更新到界面。是appendChildren用法不对吗?
appendChildren并不是直接更新视图的方法,而是用于修改节点数据的辅助方法。Tree 组件的视图更新依赖于nodes数据的变化,而不是直接调用节点实例上的方法。标准写法应该是通过
onExpand回调来动态更新nodes数据,然后让组件重新渲染。以下是修正后的代码示例:关键点在于:
1.
lazy属性只是告诉 Tree 组件某些节点是懒加载的,但具体加载逻辑需要你自己实现。2.
onExpand的回调参数node是当前展开的节点对象,你需要根据这个对象的标识(比如value或其他唯一字段)找到对应的节点并更新它的children数据。3. 更新
nodes状态后,React 会自动触发组件重新渲染,Tree 组件也会同步展示新的子节点。你原来的写法中,虽然调用了
appendChildren,但它并没有真正改变nodes数据源,所以界面不会更新。按照文档的最佳实践,动态加载子节点的核心就是更新nodes数据源,确保数据驱动视图。顺便吐槽一句,官方文档有时候确实不够直观,我也踩过类似的坑,尤其是涉及到懒加载这种需要手动管理数据的场景。希望这个例子能帮你解决问题。