React.js 小書 Lesson22 - props.children 和容器類組件


React.js 小書 Lesson22 - props.children 和容器類組件

本文做者:鬍子大哈
本文原文:http://huziketang.com/books/react/lesson22javascript

轉載請註明出處,保留原文連接以及做者信息java

在線閱讀:http://huziketang.com/books/reactreact


有一類組件,充當了容器的做用,它定義了一種外層結構形式,而後你能夠往裏面塞任意的內容。這種結構在實際當中很是常見,例如這種帶卡片組件:數組

示例圖片

組件自己是一個不帶任何內容的方形的容器,我能夠在用這個組件的時候給它傳入任意內容:less

示例圖片

基於咱們目前的知識儲備,能夠迅速寫出這樣的代碼:ide

class Card extends Component {
  render () {
    return (
      <div className='card'>
        <div className='card-content'>
          {this.props.content}
        </div>
      </div>
    )
  }
}

ReactDOM.render(
  <Card content={
    <div>
      <h2>React.js 小書</h2>
       <div>開源、免費、專業、簡單</div>
      訂閱:<input />
    </div>
  } />,
  document.getElementById('root')
)

咱們經過給 Card 組件傳入一個 content 屬性,這個屬性能夠傳入任意的 JSX 結構。而後在 Card 內部會經過 {this.props.content} 把內容渲染到頁面上。佈局

這樣明顯太醜了,若是 Card 除了 content 之外還能傳入其餘屬性的話,那麼這些 JSX 和其餘屬性就會混在一塊兒。很很差維護,若是能像下面的代碼那樣使用 Card 那想必也是極好的:this

ReactDOM.render(
  <Card>
    <h2>React.js 小書</h2>
    <div>開源、免費、專業、簡單</div>
    訂閱:<input />
  </Card>,
  document.getElementById('root')
)

若是組件標籤也能像普通的 HTML 標籤那樣編寫內嵌的結構,那麼就方便不少了。實際上,React.js 默認就支持這種寫法,全部嵌套在組件中的 JSX 結構均可以在組件內部經過 props.children 獲取到:spa

class Card extends Component {
  render () {
    return (
      <div className='card'>
        <div className='card-content'>
          {this.props.children}
        </div>
      </div>
    )
  }
}

props.children 打印出來,你能夠看到它實際上是個數組:code

示例圖片

React.js 就是把咱們嵌套的 JSX 元素一個個都放到數組當中,而後經過 props.children 傳給了 Card

因爲 JSX 會把插入表達式裏面數組中的 JSX 一個個羅列下來顯示。因此其實就至關於在 Card 中嵌套了什麼 JSX 結構,都會顯示在 Card 的類名爲 card-contentdiv 元素當中。

這種嵌套的內容成爲了 props.children 數組的機制使得咱們編寫組件變得很是的靈活,咱們甚至能夠在組件內部把數組中的 JSX 元素安置在不一樣的地方:

class Layout extends Component {
  render () {
    return (
      <div className='two-cols-layout'>
        <div className='sidebar'>
          {this.props.children[0]}
        </div>
        <div className='main'>
          {this.props.children[1]}
        </div>
      </div>
    )
  }
}

這是一個兩列布局組件,嵌套的 JSX 的第一個結構會成爲側邊欄,第二個結構會成爲內容欄,其他的結構都會被忽略。這樣經過這個佈局組件,就能夠在各個地方高度複用咱們的佈局。

總結

使用自定義組件的時候,能夠在其中嵌套 JSX 結構。嵌套的結構在組件內部均可以經過 props.children 獲取到,這種組件編寫方式在編寫容器類型的組件當中很是有用。而在實際的 React.js 項目當中,咱們幾乎天天都須要用這種方式來編寫組件。

下一節中咱們將介紹《React.js 小書 Lesson23 - dangerouslySetHTML 和 style 屬性》

相關文章
相關標籤/搜索