【Day12】插槽 Portals

Portals 是一种让 children 可以 render 到
parent component DOM 树以外 DOM 节点的方法,
适合拿来做弹窗等许多地方都会用到的组件。


使用 Portal

ReactDOM.createPortal(child, container)

  • child 是任何可 render 的 React child
  • container 则是要挂载的 DOM element

createPortal 方法在 react-dom 而非 react 里面

React 不会建立一个新的 div,
而是把第一个引数的子元素
渲染到 container 中。


使用范例

import { createPortal } from 'react-dom'

const PortalsComponent = () =>{
    return createPortal(
        <div>我是一些文字</div>,
		document.getElementById('root')
    )
}

class PortalsExample extends Component{
    render(){
        return(
            <>
                <PortalsComponent />
            </>
        )
    }
}

export default PortalsExample

弹窗范例

以下弹窗回传的是一个
createPortal 所产生的元素

import React, { Component } from 'react';
import { createPortal } from 'react-dom'
import style from './style/modal.module.scss'

class PopUp extends Component {
    render(){
        return createPortal(
            <div className={style.modal}>
                {this.props.children}
            </div>,
            document.getElementById('root')
        )
    }
}

export default PopUp

在而任意地方使用 <PopUp>
都不会受到父元件的影响
而是会 render 在根元素(#root)底下。

<PopUp>我是弹窗内容</PopUp>

Portal 的事件冒泡(Event Bubbling)

不管某个 children component 是不是用 Portal 建立的
Parent component 都一样可以捕捉
从底下元件 bubble 上来的 event


参考资料


<<:  Day13-Kubernetes 那些事 - Deployment 与 ReplicaSet(一)

>>:  Day 28 - Build a Experimental Video Speed Controller UI

Day13_HTML语法10

单行文字方块(text) 让使用者输入单行的文字叙述,例如:姓名、地址、电话、信箱等等 使用<...

#新手 询问错误原因

因作业缘故,上网找了打击砖块的游戏,需要加入自己的元素进去 目前想法是增加击中第五球後球速变快,但在...

Day19 - 铁人付外挂设定介面(一)- 资料库结构

在开始开发金流外挂的後台设定页面前,我们先来快速认识一下 WordPress 的资料表,同时介绍读取...

从零开始-30日练习开发iOS APP-UserDefault Day-28

正文: 利用 UserDefault 储存资料 预览图: 程序码: import UIKit cla...

Day 20. Zabbix 问题回报与纪录介绍

今天要跟大家介绍不是技术,但是蛮重要问题处理流程与纪录功能,这也是 Zabbix 本身就有的功能~ ...