react面試題—a組件在b組件內(nèi),c組件在a組件內(nèi),如何讓他渲染出來(lái),a組件和c組件同級(jí)

偶然看到一道react面試題,a組件在b組件內(nèi),c組件在a組件內(nèi),如何讓他渲染出來(lái),a組件和c組件同級(jí)。一想,原理應(yīng)該和Dialog的實(shí)現(xiàn)差不多,不過(guò)太久沒(méi)用那個(gè)組件已經(jīng)有點(diǎn)不記得了,而且隨著react16的出現(xiàn)也有了更好的解決方式,所以記錄一下。

老辦法

首先利用老辦法,使用unstable_renderSubtreeIntoContainer這個(gè)不穩(wěn)定api來(lái)實(shí)現(xiàn)。

// App.jsx
class App extends Component {
  render() {
    return (
      <B>
        <A><C></C></A>
      </B>
    );
  }
}
// B組件
export default class B extends Component {
  render() {
    return (
      <div>
        b組件
        <div>
          {this.props.children}
        </div>
      </div>
    );
  }
}
// C.jsx
export default class C extends Component {
  render() {
    return (
      <div>c組件</div>
    );
  }
}

B組件和C組件都沒(méi)什么特別的,主要實(shí)現(xiàn)都在A組件

// A組件
export default class A extends Component {
  componentDidMount() {
    this.parentElement = ReactDOM.findDOMNode(this).parentElement;
    this.renderChild();
  }
  componentDidUpdate() {
    this.renderChild();
  }
  renderChild() {
    const renderACom = (
      <div>
        {this.render()}
        {this.props.children}
      </div>
    )
    ReactDOM.unstable_renderSubtreeIntoContainer(
      this, renderACom, this.parentElement
    );
  }
  render() {
    return <div>a組件</div>;
  }
}

這樣就能實(shí)現(xiàn)這樣的效果。

新辦法

在react16中新添了createPortal,只用改動(dòng)一下A組件

export default class A extends Component {
  componentDidMount() {
    this.forceUpdate();
  }
  render() {
    const renderACom = (
      <div>
        <div>a組件</div>
        {this.props.children}
      </div>
    )
    if (!ReactDOM.findDOMNode(this)) {
      return <div></div>;
    }
    return ReactDOM.createPortal(
      renderACom, ReactDOM.findDOMNode(this).parentElement
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,346評(píng)論 25 708
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,388評(píng)論 0 17
  • 一只駱駝,辛辛苦苦穿過(guò)了沙漠,一只蒼蠅趴在駱駝背上,一點(diǎn)力氣也不用,也過(guò)來(lái)了。蒼蠅譏笑說(shuō):“駱駝,謝謝你辛苦把我駝...
    性淡如菊閱讀 519評(píng)論 0 1
  • 今日坐船,一路7個(gè)小時(shí),滿腦袋的孩子的聒噪聲。一個(gè)房間6個(gè)床鋪其中有一對(duì)父子,小男孩7-8歲左右。剛上船的時(shí)候,...
    一座l孤島閱讀 437評(píng)論 0 0
  • 冷 是指尖的寒氣 是熱牛奶外的圍城 一圈一圈 一層一層 包圍難得的救贖 冷 是口中呼出的熱氣 若有若無(wú)的溫暖 不起...
    言寺_d17c閱讀 153評(píng)論 0 0

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