简体   繁体   English

将React组件作为道具传递,用作在TreeView中渲染节点的模板

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM