Portal

news/2024/7/5 4:47:31

文章目录

  • 定义
  • 用法
  • 事件冒泡

定义

Portals 提供了一个最好的在父组件包含的DOM结构层级外的DOM节点渲染组件的方法。

ReactDOM.createPortal(child,container);

第一个参数child是可渲染的react子项,比如元素,字符串或者片段等。第二个参数container是一个DOM元素。

用法

普通的组件,子组件的元素将挂载到父组件的DOM节点中。

render() {
 // React 挂载一个div节点,并将子元素渲染在节点中
return (
 <div>
 {this.props.children}
 </div>
 );
 }

有时需要将元素渲染到DOM中的不同位置上去,这是就用到的portal的方法。

render(){
 // 此时React不再创建div节点,而是将子元素渲染到Dom节点上。domNode,是一个有效的任意位置的dom节点。
return ReactDOM.createPortal(
 this.props.children,
 domNode
 )
 }

一个典型的用法就是当父组件的dom元素有 overflow:hidden 或者z-inde 样式,而你又需要显示的子元素超出父元素的盒子。举例来说,如对话框,悬浮框,和小提示。

事件冒泡

虽然通过portal渲染的元素在父组件的盒子之外,但是渲染的dom节点仍在React的元素树上,在那个dom元素上
的点击事件仍然能在dom树中监听到。

import React, { Component } from 'react';
 import ReactDOM from 'react-dom';
 const getDiv = () => {
 const div = document.createElement('div');
 document.body.appendChild(div);
 return div;
 };

const withPortal = (WrappedComponent) => {
 class AddPortal extends Component {
 constructor(props) {
 super(props);
 this.el = getDiv();
 }
 componentWillUnmount() {
 document.body.removeChild(this.el);
 }
 render(props) {
 return ReactDOM.createPortal(<WrappedComponent {...props} />, this.el);
 }

}
 return AddPortal;
 };
 class Modal extends Component {
    render() {
        return (
            <div>
                <div>amodal content</div>
                <button type="button">Click</button>
            </div>
        );
    }
 }
 const PortalModal = withPortal(Modal);
 class Page extends Component {
    constructor(props) {
        super(props);
        this.state = { clicks: 0 };
        this.handleClick = this.handleClick.bind(this);
    }
    handleClick() {
        this.setState(state => ({
            clicks: state.clicks + 1
        }));
    }
    render() {
        return (
            <div onClick={this.handleClick}>
                <h3>ppppppppp</h3>
                <h3>num: {this.state.clicks}</h3>
                <PortalModal />
            </div>
        );
    }
 }
 export default Page;
 

http://lihuaxi.xjx100.cn/news/2100847.html

相关文章

前端开发者如何打造自己的生态以及ip

作为独立开发者&#xff0c;在公司的岗位上面&#xff0c;经常面对的是页面&#xff0c;但我们不能局限页面&#xff0c;页面是切入点。 1在需求页面的过程中&#xff0c;我们会接触ui&#xff0c;原型&#xff0c;软件&#xff0c;需求&#xff0c; 2在接口对接的过程中&#…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装&#xff1a; 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图&#xff1a; 2.热力图&#xff1a; 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

线上推拿按摩预约系统功能列表

扫码下单&#xff0c;预约上门现在比较流行&#xff0c;随着东郊到家的面世&#xff0c;各个推拿平台也都挤了进来&#xff0c;只要有资源&#xff0c;我们也可以做&#xff0c; 哪怕是只做一个城市&#xff0c;也是可以盈利的。 我们如何开发一个这样的平台呢&#xff0c; 以儿…

2024腾讯春招InnoDB面试宝典,最全知识点解析,面试必备!

为了帮助广大求职者更好地准备即将到来的面试&#xff0c;本文精心编撰了一系列涵盖InnoDB存储引擎关键知识点的面试题。从事务的ACID特性、索引结构设计&#xff0c;到锁机制、多版本并发控制&#xff08;MVCC&#xff09;&#xff0c;再到性能监控与优化&#xff0c;我们旨在…

音乐创作利器FL Studio21水果软件助你轻松实现音乐创意

音乐创作利器——FL Studio21水果软件&#xff0c;让你的音乐梦想起航&#xff01; 副标题&#xff1a;一款强大的电脑数码编曲软件&#xff0c;助你轻松实现音乐创意&#xff01; 一、FL Studio21水果软件——音乐制作的得力助手** 在音乐创作的道路上&#xff0c;有一款得心…

一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换到问题。 背景 在企业级的应用中&#xff0c;通常会分为&#xff0c;开发、联调、生产等多个环…

互动投影游戏如何为科普教育馆带来更加生动有趣的科普体验?

近年科普教育馆在数字多媒体技术的支持下&#xff0c;让更多的家长和孩子注意到这一展示场景&#xff0c;尤其是对孩子来说&#xff0c;这里不仅是一个扩展知识的场景&#xff0c;更是一个发掘自我、探索未知世界的地方&#xff0c;而在这个过程中&#xff0c;多媒体互动技术的…

GPT-1, GPT-2, GPT-3, InstructGPT / ChatGPT and GPT-4 总结

1. GPT-1 What the problem GPT-1 solve? 在 GPT-1 之前&#xff0c;NLP 通常是一种监督模型。 对于每个任务&#xff0c;都有一些标记数据&#xff0c;然后根据这些标记数据开发监督模型。 这种方法存在几个问题&#xff1a;首先&#xff0c;需要标记数据。 但 NLP 不像 CV&…