我想要做的是向我的树添加一个新属性,然后将其传递给它的treeNodes
. 原因是我的子节点具有secondaryLabel
. 我想使用该标签在点击时向我的 redux 商店发送一个操作。因此,在渲染我的组件时,我想将此操作传递给我的树,然后将其传递给相关节点。如果这是一个不好的方法,请在这里阻止我!
我的节点是在控制器(这是一个.ts
文件)中创建的,如下所示:
files.push({
id: generateKey(fileName), isDirectory: false, label: fileName,
filePath: fullPath, isExpanded: false, icon: 'document',
secondaryLabel: React.createElement(Icon, {icon: 'add', className: 'hoverIcon', iconSize: 16})})
由于我正在使用React.createElement
,我认为将我的操作传递给图标的最佳方式是通过树,然后在渲染它们时传递给它的节点。
我正在像这样扩展树:
export interface ICustomTreeProps<T = {}> {
onNodeAdd?: TreeEventHandler<T>
}
export class CustomTree<T = {}> extends Tree<ICustomTreeProps> {
}
这就是我的问题开始的地方:Tree
它的大部分函数都声明为private
. 我想扩展它的renderNodes
功能以将我的操作传递给节点。但是函数本身及其传递的所有内容也是私有的(https://github.com/palantir/blueprint/blob/develop/packages/core/src/components/tree/treeNode.tsx)
private renderNodes(treeNodes: Array<ITreeNode<T>>, currentPath?: number[], className?: string): JSX.Element {
if (treeNodes == null) {
return null;
}
const nodeItems = treeNodes.map((node, i) => {
const elementPath = currentPath.concat(i);
const TypedTreeNode = TreeNode.ofType<T>();
return (
<TypedTreeNode
{...node}
key={node.id}
contentRef={this.handleContentRef}
depth={elementPath.length - 1}
onClick={this.handleNodeClick}
onContextMenu={this.handleNodeContextMenu}
onCollapse={this.handleNodeCollapse}
onDoubleClick={this.handleNodeDoubleClick}
onExpand={this.handleNodeExpand}
onMouseEnter={this.handleNodeMouseEnter}
onMouseLeave={this.handleNodeMouseLeave}
path={elementPath}
>
{this.renderNodes(node.childNodes, elementPath)}
</TypedTreeNode>
);
});
return <ul className={classNames(Classes.TREE_NODE_LIST, className)}>{nodeItems}</ul>;
}
由于我不想基本上复制粘贴整个内容以扩展单个属性(然后也对TreeNode
应该发生操作的位置执行相同操作),我该如何正确执行此操作?