react面试题—a组件在b组件内,c组件在a组件内,如何让他渲染出来,a组件和c组件同级

偶然看到一道react面试题,a组件在b组件内,c组件在a组件内,如何让他渲染出来,a组件和c组件同级。一想,原理应该和Dialog的实现差不多,不过太久没用那个组件已经有点不记得了,而且随着react16的出现也有了更好的解决方式,所以记录一下。

老办法

首先利用老办法,使用unstable_renderSubtreeIntoContainer这个不稳定api来实现。

// 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组件都没什么特别的,主要实现都在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>;
  }
}

这样就能实现这样的效果。

新办法

在react16中新添了createPortal,只用改动一下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
    );
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,223评论 25 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,510评论 0 17
  • 一只骆驼,辛辛苦苦穿过了沙漠,一只苍蝇趴在骆驼背上,一点力气也不用,也过来了。苍蝇讥笑说:“骆驼,谢谢你辛苦把我驼...
    性淡如菊阅读 488评论 0 1
  • 今日坐船,一路7个小时,满脑袋的孩子的聒噪声。一个房间6个床铺其中有一对父子,小男孩7-8岁左右。刚上船的时候,...
    张德祥阅读 385评论 0 0
  • 冷 是指尖的寒气 是热牛奶外的围城 一圈一圈 一层一层 包围难得的救赎 冷 是口中呼出的热气 若有若无的温暖 不起...
    言寺_d17c阅读 129评论 0 0