嵌套组件

ReactJS 的许多功能是它允许嵌套组件的能力。采取以下两个组成部分:

var React = require('react');
var createReactClass = require('create-react-class');

var CommentList = reactCreateClass({
  render: function() {
    return (
      <div className="commentList">
        Hello, world! I am a CommentList.
      </div>
    );
  }
});

var CommentForm = reactCreateClass({
  render: function() {
    return (
      <div className="commentForm">
        Hello, world! I am a CommentForm.
      </div>
    );
  }
});

你可以在不同组件的定义中嵌套并引用这些组件:

var React = require('react');
var createReactClass = require('create-react-class');

var CommentBox = reactCreateClass({
  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList /> // Which was defined above and can be reused
        <CommentForm /> // Same here
      </div>
    );
  }
});

进一步的嵌套可以通过三种方式完成,它们都有自己的使用位置。

1.不使用儿童进行嵌套

(从上面继续)

var CommentList = reactCreateClass({
  render: function() {
    return (
      <div className="commentList">
        <ListTitle/>
        Hello, world! I am a CommentList.
      </div>
    );
  }
});

这是 A 组成 B 和 B 组成 C 的风格。

优点

  • 轻松快速地分离 UI 元素
  • 根据父组件的状态,可以轻松地向子项注入道具

缺点

  • 对组合体系结构的可见性较低
  • 可重用性较低

好的,如果

  • B 和 C 只是表示组件
  • B 应该负责 C 的生命周期

2.使用儿童筑巢

(从上面继续)

var CommentBox = reactCreateClass({
  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList>
            <ListTitle/> // child
        </CommentList>
        <CommentForm />
      </div>
    );
  }
});

这是 A 组成 B 和 A 告诉 B 组成 C 的样式。对父组件的更多权力。

优点

  • 更好的组件生命周期管理
  • 更好地了解构图架构
  • 更好的可重用性

缺点

  • 注入道具可能会变得有点贵
  • 儿童组件的灵活性和功能较小

好的,如果

  • B 应该接受在将来或其他地方撰写与 C 不同的东西
  • A 应该控制 C 的生命周期

B 会使用 this.props.children 渲染 C,并且 B 没有结构化的方式来知道这些孩子的用途。因此,B 可以通过提供额外的道具来丰富子组件,但如果 B 需要确切知道它们是什么,#3 可能是更好的选择。

3.使用道具嵌套

(从上面继续)

var CommentBox = reactCreateClass({
  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList title={ListTitle}/> //prop
        <CommentForm />
      </div>
    );
  }
});

这是 A 组成 B 和 B 为 A 提供选项以传递某些特定目的的组合的样式。更有条理的构图。

优点

  • 作为一个功能组成
  • 轻松验证
  • 更好的可组合性

缺点

  • 注入道具可能会变得有点贵
  • 儿童组件的灵活性和功能较小

好的,如果

  • B 具有定义的特定功能以构成某些东西
  • B 应该只知道如何呈现不呈现的内容

#3 通常是制作组件公共库的必要条件,但通常也是制作可组合组件并明确定义组合特征的良好实践。 #1 是最简单,最快速的,但是#2 和#3 应该在各种用例中提供某些好处。