【发布时间】:2021-09-12 23:12:00
【问题描述】:
当我执行以下操作时,我可以使用箭头键在树中导航,并且当我在文档中切换时树获得焦点(只有根项目,子分支被破坏,因为它们使用分支):
const Item = React.memo(function Item({ item }) {
const { onChange } = useContext(DataContext);
return (
<TreeItem
key={item.key}
nodeId={item.key}
label={item.name}
>
{Boolean(item?.children) && (
<Branch data={item.children} />
)}
</TreeItem>
);
});
<TreeView multiSelect selected={NONE}>
{data
.map((item) => (
<Item
key={item.key}
item={item}
nodeId={item.key}
/>
))}
</TreeView>
但是当我执行以下操作时,在文档中切换时树不会集中,并且上下箭头不会在树中导航(仅在单击树中的项目后向左和向右):
<TreeView multiSelect selected={NONE}>
<Branch data={data} />
</TreeView>
我认为它与not forwarding a ref 有关我尝试使用类组件(React.PureComponent)但没有改变。我认为TreeItem 或TreeView 的直系子节点需要有一个 nodeId 道具,但对于一组节点来说,这将是什么?
一个example 显示此工作,但我无法将 nodeId 传递给分支,因为它接收到多个。 Another example 显示使用 renderTree 函数,但我的项目有一个复选框,选中一个项目会导致整个树重新绘制。
如果我需要转发一个 ref 那么它是什么,没有给出这方面的例子?
更新
我走得更远,注意到它(不是)通过nodeId 会破坏它:
const Item = React.memo(function Item({ parent }) {
const { map } = useContext(DataContext);
const parentItem = map.get(parent);
const children = !parentItem?.children
? null
: parentItem.children.map((key) => (
<Item key={key} parent={key} nodeId={key} />
));
//this will not render root but crashes when Tree passes
// a nodeId
if (!parentItem.parent) {
return children;
}
return (
<TreeItem
key={parentItem.key}
nodeId={parentItem.key}
label={parentItem.name || "root"}
>
{children}
</TreeItem>
);
});
const Tree = React.memo(function Tree({ parent }) {
return (
<TreeView
multiSelect
selected={NONE}
defaultCollapseIcon={<ExpandMoreIcon />}
defaultExpandIcon={<ChevronRightIcon />}
>
{/* if item does not render parent and I pass nodeId
it will crash if no nodeId is passed then key
navigation is broken again */}
<Item parent={parent} nodeId={parent} />
</TreeView>
);
});
如果我通过 nodeId 但不渲染 root 错误是:
未捕获的类型错误:无法读取未定义的属性“孩子” 在 buildVisible (TreeView.js:590)
上述错误发生在
组件中:
传递 nodeId 并渲染 root 将起作用,但 root 是一个虚拟对象,使递归更容易,所以我不想渲染它。
【问题讨论】:
标签: reactjs treeview react-material