【问题标题】:ReactJS Component with "sub-components"带有“子组件”的 ReactJS 组件
【发布时间】:2018-08-09 07:57:27
【问题描述】:

我对 ReactJS 很陌生,并开始制作一些这样的组件:

class Row extends React.Component {
    render() {
        return (
            <div className={"row w-100 ml-0 mr-0 " + this.props.className}>
                {this.props.children}
            </div>
        );
    }
}

我现在想要实现的是这个组件具有“子组件”(我不知道正确的词)之类的或类似的东西。

我是否必须为此创建另一个组件,或者是否可以在一个组件中实现它?

编辑:

我有这个组件里面已经有子组件:

<div className="custom-card">
    <Card>
        <CardHeader onClick={this.toggle} className={"card-header " + ((!this.props.readOnly && this.props.headerCtrl) && "pt-0")}>
            <CardTitle className="card-title d-flex justify-content-between">
                <p>{this.props.title}</p>
            </CardTitle>
        </CardHeader>
        <Collapse isOpen={this.state.collapse}>
            <CardBody className="card-body">
                {this.props.children}
            </CardBody>
        </Collapse>
    </Card>
</div>

但我也希望用户可以指定应该在卡片头中显示哪个组件。这样不仅可以有&lt;p&gt;,还可以有&lt;input&gt;等等。

【问题讨论】:

  • 那么......你想达到什么目的?你想卡片组件在行中吗?还是什么?
  • 我编辑了帖子,现在可能更好理解
  • 如果我理解正确,当用户点击某些东西时,您想隐藏和创建一些元素?

标签: javascript html reactjs


【解决方案1】:

如果我理解正确,您需要多个占位符,而不仅仅是一个 children。幸运的是,React 元素只是 JavaScript 对象,您可以将它们作为道具传递。

当您的组件 (&lt;CustomCard&gt;) 具有类似于您问题中的渲染方法时(未更改):

<div className="custom-card">
  <Card>
    <CardHeader onClick={this.toggle} className={"card-header " + ((!this.props.readOnly && this.props.headerCtrl) && "pt-0")}>
      <CardTitle className="card-title d-flex justify-content-between">
        <p>{this.props.title}</p>
      </CardTitle>
    </CardHeader>
    <Collapse isOpen={this.state.collapse}>
      <CardBody className="card-body">
        {this.props.children}
      </CardBody>
    </Collapse>
  </Card>
</div>

您可以像这样为标题传递自定义组件:

<CustomCard title={<SpecialTitle>My special title</SpecialTitle>}>
  My card body!
</CustomCard>

【讨论】:

  • 这很简单也很好,谢谢!但是这种方式是一种好的“编码风格”吗?
  • 我相信是的。有不同的变体,一些直接传递元素,另一些传递返回元素的函数。 React 甚至有关于这种模式的官方文档:reactjs.org/docs/render-props.html
【解决方案2】:

您可以使用高阶组件 (HOC) 来提供自定义组件,同时保持其他部分不变。您的用例的典型 HOC 如下所示

const HeaderHOC = (Component) => {
    return class extends React.Component {
       render() {
           <div className="custom-card">
                <Card>
                    <CardHeader onClick={this.toggle} className={"card-header " + ((!this.props.readOnly && this.props.headerCtrl) && "pt-0")}>
                        <Component {...this.props} />
                    </CardHeader>
                    <Collapse isOpen={this.state.collapse}>
                        <CardBody className="card-body">
                            {this.props.children}
                        </CardBody>
                    </Collapse>
                </Card>
            </div>
       }
    }
}

当你想使用这个 HOC 时,你可以这样做

const CardTitleComp = (props) => (
     <CardTitle className="card-title d-flex justify-content-between"><p>{props.title}</p></CardTitle>   
)

const CustomComp = HeaderHOC(CardTitleComp);

【讨论】:

  • 但是我该如何使用这个组件呢?我需要像这样使用它:
  • @mantaplatte,是的,你可以按照你说的那样写。而不是 CardTitle,如果你想使用 CardBody,你可以简单地使用 cardBody 创建自定义组件并传递所需的道具
  • 嗯,我还是不明白如何使用 HeaderHOC。如果我想在页面上使用它,例如在这样的列中:&lt;div className="col-md-3&gt;*/Here should the component be*/&lt;/div&gt;" 语法如何?
猜你喜欢
  • 2015-04-05
  • 2018-05-10
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多