[英]Pass React component as props to be used as a template to render nodes in a TreeView
I am building a flexible <TreeView />
component, where the user will be able to inject his own <TreeNode />
, as an HTML template. 我正在构建一个灵活的
<TreeView />
组件,用户可以在其中注入自己的<TreeNode />
,作为HTML模板。
What I currently do works, but I can't set the propTypes as mandatory with my design pattern, because the <TreeNode />
component only receive its props when I use it in <TreeView />
, in a map
function. 我目前所做的工作正常,但是我无法在设计模式中将propTypes设置为强制性的,因为
<TreeNode />
组件仅当在map
函数中的<TreeView />
使用它时才接收其道具。
Is there a better way to do this so I can use mandatory propTypes? 有没有更好的方法可以执行此操作,以便可以使用强制性propTypes?
TreeNode.js : TreeNode.js :
const TreeNode = (props) => {
return (
<div>
<p>{props.id}</p>
<p>{props.nodeTitle}</p>
<p>{props.nodeDescription}</p>
</div>
)
}
TreeView.js , very simplified: TreeView.js ,非常简化:
export class TreeView extends React.Component {
render() {
const childrenList = props.treeViewData.map((treeNodeData) => {
const treeNodeTemplateProps = {
id: treeNodeData.id,
nodeTitle: treeNodeData.nodeTitle,
nodeDescription: treeNodeData.nodeDescription
}
const treeNodeTemplate = this.props.treeNodeTemplate(treeNodeTemplateProps )
return (
{treeNodeTemplate}
)
})
return <div>{childrenList}</div>
}
}
index.js index.js
import { TreeView } from './TreeView'
import { treeViewData } from './treeViewData'
import { TreeNode } from './TreeNode'
const element = <TreeView
treeViewData={treeViewData}
treeNodeTemplate={TreeNode} />
ReactDOM.render(element , document.getElementById('root'))
While treenode is a functional component you can provide propTypes to it as you would do with another component: 虽然treenode是一个功能组件,但是您可以像使用其他组件一样向其提供propTypes:
const TreeNode = (props) => { return ( <div> <p>{props.id}</p> <p>{props.nodeTitle}</p> <p>{props.nodeDescription}</p> </div> ) } TreeNode.propTypes = { title: PropTypes.string }; // Same approach for defaultProps too TreeNode.defaultProps = { title: "No Title", }; export default TreeNode;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.