巢狀元件

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 應該在各種用例中提供某些好處。