ReactJs-如何在组件中使用多个子代

时间:2019-11-11 09:24:05

标签: javascript html reactjs components

我以我对ReactJs还是很陌生的事实作为开始,并可能试图制定一些非常基础的东西。

我有一段带有自定义HTML的代码:

示例组件

gem install rdoc

侧面问题-上面的正确名称是什么?碎片?它看起来并不是一个“组件”,而只是也学习了React的命名约定

使用组件

const Sample = ({ title, children }) => {
    return (
          <div class="panel">
              <div class="title">
                 {title}
              </div>
              <div class="body">
                 {children}
              </div>
           </div>    
     );
};


您可以看到“ Sample”元素的内容被自动视为 children 属性,但是要设置标题,我必须显式设置“ title”属性。我理想地想要做的是与下面类似的事情:

使用示例组件的所需方式

export default class ExampleComponent extends Component {
    render() {
        return <div class="page-body">
            <div class="row">
                <h1> Page 1 </h1>
                <Sample title={<h1>Some title!</h1>}>
                   <p>This is my sample body!</p>
                </Sample>
            </div>
        </div>
    }
}

我在其他人创建的组件之前使用过这种类型的方法,但是现在我想自己做,发现很难找到一个简单的示例来做这个事情。

在此先感谢任何指针!

3 个答案:

答案 0 :(得分:3)

我想您想要的是JSX Namespacing吗?无论哪种方式,您都可以实例化Sample,然后将更多组件添加为Sample的属性(将其视为对象):

import React from "react"

const Sample = ({ children }) => (
  <div className="panel">
      {children}
  </div>    
)


Sample.Title = (props) => <div className="title">{props.children}</div>
Sample.Body = (props) => <div className="body">{props.children}</div>

export default Sample

注意:由于我们使用的是JSX,因此React使用className而不是class

答案 1 :(得分:2)

在这种情况下,您只需要将相关的容器提取到它们自己的组件中即可

const Sample = ({children }) => (
    <div className="panel">{children}</div>    
);

const Title = ({children}) => (
    <div className="title">{children}</div>
);

const Body = ({children}) => (
    <div className="body">{children}</div>
);

Sample.Title = Title;
Sample.Body = Body;

还要注意,css类的正确属性是className

答案 2 :(得分:2)

Children实用套装对您的情况很有帮助。

import { Children } from 'react'

const Sample = ({ title, children }) => {
  let _body, _title

  Children.forEach(children, child => {
    if (child.type === SampleTitle) {
      return _title = child
    }

    if (child.type === SampleBody) {
      return _body = child
    }
  })

  if (!_title) _title = <div className='title'>{title}</div>
  if (!_body) _body = <div className='title'>{children}</div>

  return (
    <div className='panel'>
      {_title}
      {_body}
    </div>
  )
}

const SampleTitle = ({ children }) => <div className='title'>{children}</div>
const SampleBody = ({ children }) => <div className='body'>{children}</div>

Sampe.Title = SampleTitle
Sample.Body = SampleBody

现在您可以通过多种方式使用示例:

<Sample title="my title">
  <div>my body</div>
</Sample>

<Sample title="my title">
  <Sample.Body>my body</Sample.Body>
</Sample>

<Sample title="my fallback title">
  <Sample.Title>my overriding title</Sample.Title>
  <Sample.Body>my body</Sample.Body>
</Sample>