自己使用react写一个弹框组件(3)

组件的基本构架已经完成,现在要想一想解耦的事情了,因为这个组件是公用的组件,要在不同的组件下使用。要适应不同父组件的css样式很难,我们也不知道父组件的外部样式是怎么样的。既然这样,就要想一种办法,直接在指定的dom节点挂载组件。

React Portals

https://reactjs.org/docs/portals.html

Portals provide a first-class way to render children into a DOM node that exists outside the DOM hierarchy of the parent component.

顾名思义就是传送门提供一种特殊的方式将子节点挂在在dom节点的任何一个地方。

使用方式
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types'
  
  
class PortalWrapper extends React.Component {
  constructor(props) {
    super(props)
    this.node = document.createElement('div')
    document.body.appendChild(this.node)
  }
  render() {
    const {  children } = this.props;
    return  ReactDOM.createPortal(
      children,
      this.node,
    );

  }
}
  
  
PortalWrapper.defaultProps = {}
PortalWrapper.propTypes = {}
  
  
export default PortalWrapper

在react16中,传送门api直接被封装在ReactDOM.createPortal()这个方法中了,它接收一个node类型的参数,这个参数就是你要挂载的dom节点,在这里我们新建了一个高阶组件PortalWrapper,用它来封装传送门的api,因为我不想把这里面的逻辑和modal组件混起来,所以有了这个高阶组件,在原来的SevenModal组件中就可以用<PortalWrapper>包裹起来。在这里我们挂在body下的一个div中

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天上午组内小朋友们谈到 React 实践,提到 React 模态框(弹窗)的使用。我发现很多一些 React 开...
    LucasHC阅读 1,881评论 0 17
  • 转载自:前端外刊评论-知乎专栏——《深入 React 技术栈》章节试读 《深入 React 技术栈》尽管并不是一本...
    晓松阅读 3,888评论 0 10
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 829评论 0 3
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,744评论 0 7
  • 我很忙,忙着写文章,忙着排版文章,忙着发文章。我把自己的爱好做成了习惯,只因为这种习惯让我快乐又安然。 在这纷扰的...
    李冰儿阅读 550评论 2 3