react嵌套組件的通信

在react開發(fā)中,在某些場景會遇到如下組件嵌套形式的開發(fā),比如說tab組件,下拉框組件等等

<RadioGroup>
    <RadioOption label="選項一" value="1" />
    <RadioOption label="選項二" value="2" />
</RadioGroup>

如果想把父組件中的屬性傳給所有的子組件,該怎么做呢?
如果子組件想調(diào)用父組件內(nèi)部的方法,又該怎么做呢?

下面通過一個demo,來回答這倆個問題,不過在此之前需要理解以下一些概念

  • this.props.children是React內(nèi)建的一個屬性,用來獲取組件的子元素(注意:如果子元素為空,this.props.children為undefined,如果子元素有一個,this.props.children為Object,子元素有多個,this.props.children為Array,沒錯,就是這么坑,但別急,請看下一條)
  • react提供React.Children來處理this.props.children,使用React.Children.map來遍歷子節(jié)點,不用擔心 this.props.children 的數(shù)據(jù)類型是 undefined 還是 object 還是 Array,方法內(nèi)部已經(jīng)做了處理,就是這么酷
  • React.cloneElement克隆并返回一個新的 ReactElement (內(nèi)部子元素也會跟著克?。?,新返回的元素會保留有舊元素的 props、ref、key,也會集成新的 props(只要在第二個參數(shù)中有定義)。

回到demo,我們寫一個radio選擇的組件,將radio組合起來,這樣就要求radio的name一致,父組件為RadioGroup,name屬性在父組件中設置:

class RadioOption extends React.Component{
  render() {
        return (
        <label>
        <input type="radio" value={this.props.value} name={this.props.name}  onClick={()=>{this.props.showValue(this.props.value)}}/>
        {this.props.label}
      </label>
    );
  }
};

class RadioGroup extends React.Component{
//父組件方法
  showValue(val){
    console.log(val)
  }
  renderChildren(props) {
    //遍歷所有子組件
    return React.Children.map(this.props.children, child => {
      if (child.type === RadioOption)
        return React.cloneElement(child, {
          //把父組件的props.name賦值給每個子組件(父組件傳值給子組件)
          name: props.name,
          //父組件的方法掛載到props.showValue上,以便子組件內(nèi)部通過props調(diào)用
          showValue:this.showValue
        })
      else
        return child
    })
  }
  render() {
    return(
        <div>
          {this.renderChildren(this.props)}
        </div>
    )
  }
};
 
ReactDOM.render(
  <RadioGroup name="option">
    <RadioOption label="選項一" value="1" />
    <RadioOption label="選項二" value="2" />
  </RadioGroup>,
    document.getElementById('container')
);

jsfiddle
代碼略長,但是仔細看過及閱讀注釋后,你會對開頭提的兩個問題豁然開朗。
總結下,其實萬變不離其宗,通過React.cloneElement給子元素添加props屬性,由于此方法運行在父元素的作用域中,所以可以獲取父元素的屬性和方法,以此達成通信的目的。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 原教程內(nèi)容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,931評論 1 18
  • 自己最近的項目是基于react的,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,733評論 1 10
  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,175評論 2 35
  • 孤燈泛黃 柳葉似墨 流螢無恨悠然笑 不知撲火焚九重 但得流光溢彩 旅人乏坐 獨自清酢 多情總被無情惱 何知佳人到何...
    契丹大漢閱讀 203評論 0 0
  • 兩天沒寫寫畫畫 手生,還是要多寫寫畫畫,
    七月的陽光閱讀 129評論 0 0

友情鏈接更多精彩內(nèi)容