reactjs - Material-UI TreeView - 如何获取被点击的 TreeItem 的 nodeId?
问题描述
我正在使用Material UIs Tree View,我想在nodeId
单击图标时获取该项目的道具或 。如何做到这一点?基本上,我想要一个删除图标,它会调用 API 来根据节点的 ID 删除节点。
在他们的例子中,他们正在传递props
,但是当我这些道具时MinusSquare
,它们是空的。PlusSquare
console.log
function MinusSquare(props) {
return (
<SvgIcon fontSize="inherit" style={{ width: 14, height: 14 }} {...props}>
...
</SvgIcon>
);
}
...
<TreeView
aria-label="customized"
className={classes.root}
defaultExpanded={['1']}
defaultCollapseIcon={<MinusSquare />}
defaultExpandIcon={<PlusSquare />}
defaultEndIcon={<CloseSquare />}
>
<StyledTreeItem nodeId="1" label="Main"> <!--- get these nodeId values and/or other props --->
<StyledTreeItem nodeId="2" label="Hello" />
<StyledTreeItem nodeId="3" label="Subtree with children">
<StyledTreeItem nodeId="6" label="Hello" />
<StyledTreeItem nodeId="7" label="Sub-subtree with children">
<StyledTreeItem nodeId="9" label="Child 1" />
<StyledTreeItem nodeId="10" label="Child 2" />
<StyledTreeItem nodeId="11" label="Child 3" />
</StyledTreeItem>
<StyledTreeItem nodeId="8" label="Hello" />
</StyledTreeItem>
<StyledTreeItem nodeId="4" label="World" />
<StyledTreeItem nodeId="5" label="Something something" />
</StyledTreeItem>
</TreeView>
解决方案
4.9.13
Material -UIonIconClick
为TreeItem
. 由于每个都TreeItem
需要附加点击侦听器,因此您应该编写一个包装器组件来重用代码:
function MyTreeItem(props) {
return (
<TreeItem
{...props}
onIconClick={() => console.log('delete', props.nodeId)}
/>
);
}
不幸的是,这个道具在 Material-UI5.0.0 alpha-12
中被移除了,取而代之的是ContentComponent
. 此 API 要求您编写更多代码,以换取更灵活的自定义:
import Typography from "@material-ui/core/Typography";
import IconButton from "@material-ui/core/IconButton";
import DeleteIcon from "@material-ui/icons/Delete";
import TreeView from "@material-ui/lab/TreeView";
import TreeItem, { useTreeItem } from "@material-ui/lab/TreeItem";
import clsx from "clsx";
const CustomContent = React.forwardRef(function CustomContent(props, ref) {
const {
classes,
label,
nodeId,
icon: iconProp,
expansionIcon,
displayIcon,
onDelete
} = props;
const {
disabled,
expanded,
selected,
focused,
handleExpansion,
handleSelection,
preventSelection
} = useTreeItem(nodeId);
const icon = iconProp || expansionIcon || displayIcon;
const handleDelete = () => onDelete(nodeId);
return (
<div
className={clsx(classes.root, {
[classes.expanded]: expanded,
[classes.selected]: selected,
[classes.focused]: focused,
[classes.disabled]: disabled
})}
onMouseDown={preventSelection}
ref={ref}
>
<div onClick={handleExpansion} className={classes.iconContainer}>
{icon}
</div>
<IconButton size="small" onClick={handleDelete}>
<DeleteIcon fontSize="small" />
</IconButton>
<Typography
onClick={handleSelection}
component="div"
className={classes.label}
>
{label}
</Typography>
</div>
);
});
TreeItem
function MyTreeItem(props) {
return (
<TreeItem
{...props}
ContentComponent={CustomContent}
ContentProps={{
onDelete: (nodeId) => console.log("delete", nodeId)
}}
/>
);
}
TreeView
<TreeView
defaultCollapseIcon={<ExpandMoreIcon />}
defaultExpandIcon={<ChevronRightIcon />}
multiSelect
>
<MyTreeItem nodeId="1" label="Applications">
<MyTreeItem nodeId="2" label="Calendar" />
<MyTreeItem nodeId="3" label="Chrome" />
<MyTreeItem nodeId="4" label="Webstorm" />
</MyTreeItem>
<MyTreeItem nodeId="5" label="Documents">
<MyTreeItem nodeId="6" label="Material-UI">
<MyTreeItem nodeId="7" label="src">
<MyTreeItem nodeId="8" label="index.js" />
<MyTreeItem nodeId="9" label="tree-view.js" />
</MyTreeItem>
</MyTreeItem>
</MyTreeItem>
</TreeView>
现场演示
推荐阅读
- html - 防止文本在 div 中换行,但并非没有
- c# - EF Core 2.1 HasData() 在后续迁移中为未更改的实体创建删除和重新插入
- c++ - 为什么这个程序不输出布尔值?
- ruby-on-rails - 是否可以在生产环境中使用 Rails、Webpacker 将 Vue.js 组件挂载到 DOM 上?
- python-3.x - 如何使用 Pandas 作为函数将数值重新分类到新的分组中,没有条件限制
- ruby-on-rails - Rails 和 Rspec 单元测试静态方法
- ios - iOS PDFKit - 宽度问题
- javascript - HTML 防盗
- python - 使用模拟数据进行深度学习
- python - 如何随机化 if/elif 语句的顺序?