react组件之Portals--组件跳出原DOM结构

贾葛
• 阅读 1343

能力:将子节点渲染到存在于父组件以外的DOM节点

语法ReactDOM.createPortal(child, container)

参数
child:任何可渲染的React子元素
container:一个DOM元素(你想要渲染到的目标容器)

demo

render() {
    return ReactDOM.createPortal(
        this.props.children,
        domNode
    );
}

应用场景
当父组件有overflow: hiddenz-index样式,而你需要子组件在视觉上跳出容器时。【对话框、悬浮卡及提示框等】

事件冒泡:一个从protal内部触发的事件会一直冒泡到react树的祖
先,如以下DOM结构中,#app-root中的Parent组件可以捕获到从兄弟节点#modal-root冒泡上来的事件。

<html>
  <body>
    <div id="app-root"></div>
    <div id="modal-root"></div>
  </body>
</html>

class Modal extends React.Component {
    constructor(props) {
        super(props);
        this.el=document.createElement('div');
    }
    componentDidMount() {
        modalRoot.appendChild(this.el);
    }
    componentWillUnmount() {
        modalRoot.removeChild(this.el);
    }
    render() {
        ReactDOM.createPortal(
            this.props.child,
            this.el
        );
    }
}
class Parent extends React.Component {
    render() {
        <Modal>
            <button>click</button>
        </Modal>
    }
}
ReactDOM.render(<Parent />, appRoot);
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
爱丽丝13 爱丽丝13
4年前
React 组件通信之发布订阅模式
React通信react的数据流是单向的,react通信有以下几种方式:父向子通信:传入props子向父通信:父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值父向孙通信:利用context传值。React.createContext()兄弟间通信:​1、找一个相同的父组件,既可以用pr
Wesley13 Wesley13
3年前
03. react 初次见面
    与浏览器的DOM元素不同,React当中的元素事实上是普通的对象,ReactDOM可以确保浏览器DOM的数据内容与React元素保持一致。1、将元素渲染到DOM中    首先我们在一个HTML页面中添加一个id"root" 的<div:<divid"root"
Stella981 Stella981
3年前
React的单向数据流与组件间的沟通
今天来给大家总结下React的单向数据流与组件间的沟通。首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则。先介绍单向数据流吧。React单向数据流:React是单向数据流,数据主要从父节点传递到子节点(通过props)。如果顶层(父级)的某个props改变了,React会重渲染所有的子节点。刚才我们提到了
Stella981 Stella981
3年前
React 入门及学习笔记
React构建用户界面的JavaScript库,主要用于构建UI界面。Instagram,2013年开源。特点:1.声明式的设计2.高效,采用虚拟DOM来实现DOM的渲染,最大限度的减少DOM的操作。3.灵活,跟其他库灵活搭配使用。4.JSX,俗称JS里面写HTML,JavaScript语法的扩展。5.组件化,模
Wesley13 Wesley13
3年前
oracle的start with connect by prior如何使用
oracle的startwithconnectbyprior是根据条件递归查询"树",分为四种使用情况: 第一种:startwith子节点ID'...'connectbyprior子节点ID父节点IDselectfrommdm_organizationostartwitho.org_code'
Stella981 Stella981
3年前
React Portals
Portal提供了一种将子节点渲染到存在于父组件以外的DOM节点的优秀的方案。常见场景:对话框、悬浮卡以及提示框!定义一个模态框组件:importReact,{useRef,useEffect,}from'react';importReactDOMfrom'reactdo
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Lightning Web Components html_templates(三)
LightningWebComponents强大之处在于模版系统,使用了虚拟dom进行智能高效的组件渲染。使用简单语法以声明方式将组件的模板绑定到组件的JavaScript类中的数据数据绑定我们可以使用{property}绑定组件模版属性到一个组件js类中的属性一个简单的例子组件class
React memo的原理、实践与思考
前言在react中,对一个组件进行点击事件等操作时,该组件以及该组件的子组件都会重新渲染。避免组件的重新渲染一般可以借助React.memo、useCallback等来实现。什么是memomemo原理memo类似于class中pureComponent的特