具有动态子组件的ReactJS布局组件

时间:2015-02-05 21:32:38

标签: javascript layout dynamic components reactjs

使用React 0.12.2并给出一个布局组件,例如:托盘:

<div className="tray">
    <div className="tray__item tray__item--left" data-width="260px">
        Load a component in the left tray
    </div>
    <div className="tray__item tray__item--center">
        Load a component in the center tray
    </div>
    <div className="tray__item tray__item--right" data-width="100%">
        Load a component in the right tray
    </div>
</div>

我希望能够将任意组件插入到每个内容中,并将它们作为args传递给此组件。

也许是这样的:

<Tray left={Component1} center={Component2} right={Component3}/>

我还想知道如何传递未知数量的组件,例如:

<Carousel items={Component1,Component2,Component3,Component4}/>

为了清楚起见 - 这些容器组件是“愚蠢的”#34; - 他们只关心滑动内容 - 你应该能够传递你想要的任何内容(组件)。

我该怎么做才能渲染它们?感谢。

3 个答案:

答案 0 :(得分:2)

在Tray的渲染方法中,你可以做到

render: function() {
    return (
      <div className="tray">
        {this.props.children}
      </div>
    );
  }

然后在托盘所在的组件中,你可以做到

<Tray>
  <TrayItem position="left"/>
  <TrayItem position="center"/>
  <TrayItem position="right"/>
</Tray>

你应该能够保持这种模式的嵌套,即

<Tray>
  <TrayItem position="left">
     <SomeComponent/>
  </TrayItem>

  <TrayItem position="center">
     <div>
       <AnotherComponent/>
     </div>
  </TrayItem>

  <TrayItem position="right"/>
</Tray>

在这种情况下,TrayItem的渲染还应包括{this.props.children}

一般原则是,只要容器组件的渲染包含{this.props.children},您就可以将任意组件放在其他组件中。

答案 1 :(得分:2)

感谢Adam Stone + SimpleJ的答案。

var Tray = React.createClass({
    render: function () {
        return (
            <div className="tray">
                {this.props.children}
            </div>
        );
    }
});

var TrayItem = React.createClass({
    render: function () {
        return (
            <div className="tray__item">
                {this.props.children}
            </div>
        );
    }
});

<Tray>
    <TrayItem>
        <ComponentA/>
        <ComponentAB/>
    </TrayItem>
    <TrayItem>
        <ComponentB/>
    </TrayItem>
    <TrayItem>
        <ComponentC/>
    </TrayItem>
</Tray>

答案 2 :(得分:-1)

您应该只在其渲染功能中创建一个包含多个子组件的容器组件。您永远不想将组件作为prop

传递