反应组件可以有多个儿童内容区域吗?

16 javascript reactjs

假设我有一个简单的反应组件:

import React from 'react';
import styles from "./index.css";

export default React.createClass({
  render: function() {
    return (
      <header className={styles.root}>
        // area for child content
        {this.props.children}
      </header>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

现在让我们说代替任何子组件的一个区域,我想要两个,就像这样:

import React from 'react';
import styles from "./index.css";

export default React.createClass({
  render: function() {
    return (
      <header className={styles.root}>
        <div className={styles.logo}>
          // logo children here
        </div>
        <div>
          // navigation children here
        </div>
      </header>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用属性,但对于大量的html内容来说,这不是很优雅.如何通过类似于例如swig中的命名块的方式做出反应?


命名块的示例:

{% extends 'layout.html' %}

{% block title %}My Page{% endblock %}

{% block head %}
  {% parent %}
  <link rel="stylesheet" href="custom.css">
{% endblock %}

{% block content %}
<p>This is just an awesome page.</p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

您可以看到这些块可以通过引用它们的名称来使用,从而允许"产生"多个内容区域.我希望有一个同样优雅的方式来做这个,因为它使组件非常可组合.

Kok*_*lav 20

import React, { Component } from 'react';
import styles from "./index.css";
import Logo from "./components/Logo";
import Navbar from "./components/Logo";

class Comp extends Component {
    render(){
        return (
            <Header className={styles.root}
                top={Logo}
                right={Navbar}
                />
        );
    }
}

class  Header extends Component {
    render(){
        let {top,right} =this.props;
        return (
            <header className={styles.root}>
                <div className={styles.logo}>
                    {top && <top />}
                </div>
                <div>
                    {right && <right />}
                </div>
            </header>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,即使反应文档建议采取这种方法https://facebook.github.io/react/docs/composition-vs-inheritance.html是假的'不要使用道具传递组件作为孩子`"道具和组合为您提供了以显式和安全的方式自定义组件外观和行为所需的所有灵活性.请记住,组件可以接受任意道具,包括原始值,React元素或函数." (3认同)

Piy*_*oor 14

Make seperate components Donot use props to pass components as children.
something like this.
Run Code Online (Sandbox Code Playgroud)

//header.js

import React from 'react';
import styles from "./index.css";

export default React.createClass({
  getComponent(key) {
     return this.props.children.filter( (comp) => {
             return comp.key === key;
     });
  }
  render: function() {
    return (
      <header className={styles.root}>
        <div className={styles.logo}>
          {this.getComponent('logo')}
        </div>
        <div>
         {this.getComponent('navbar'}

        </div>
      </header>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

//app.js

export default React.createClass({
      render: function() {
        return (
          <Header>
            <Logo key="logo"/>
            <Navbar key="navbar"/>
          </Header>
        );
      }
    });
Run Code Online (Sandbox Code Playgroud)