以前写globalmask的时候一般都是固定定位。示例代码如下:.modal{position:fixed;左:0;右:0;顶部:0;底部:0;z-指数:500;background:black;}这样就实现了全局遮罩层,自己控制modal中的内容。但是这种方式会有一个问题,具体如下:可以看到这个弹窗的内容不在body下面的层中,而是在逐层嵌套的dom中,其中会有两个缺点:DOM结构不够优雅。组件的样式可能会影响子组件的样式。这是一个真实的案例。我同事也用上面固定定位的方式生成了一个全局弹窗,但是发现点击按钮不能改变弹窗的显示,然后发现他写了一个奇怪的。代码大致如下:return()and然后我发现点击这个按钮是不能控制modal的显示和隐藏的,因为这个按钮严重影响了modal的行为。这种问题其实很难排查。你不知道用户写了什么奇怪的代码。这时候考虑其他的方法来避免这个问题。当用户使用modal时,modal的DOM实际上是挂载在当前组件下的。试想一下,如果直接将DOM插入到body中,是否可以避免这些问题。幸运的是,React提供了这样的能力。下面介绍一下React提供了什么。引入PortalPortal,将子组件渲染到父组件以外的DOM节点。Portal可以将子组件渲染到DOM树而不是父组件。通常用于子组件需要从父组件的容器中分离出来的场景。有以下场景:Dialog对话框Tooltip文字提示Popover弹出框Loader全局加载器下面是它的使用方法:React.createPortal();第一个参数(child)是任何可渲染的React子元素,例如元素、字符串或片段。第二个参数(容器)是一个DOM元素。这是一个使用react.createPortal的简单示例:constModal=({message,visible,onClose,children})=>{if(!visible)returnnull;returnReactDOM.createPortal(
