react portals 插槽 实现简易弹窗
Portal 提供了一种将子节点渲染到存在于父节点以外的DOM节点的优秀方案;
尽管 portal 可以被放置在 DOM 树中的任何地方,但在任何其他方面,其行为和普通的 React 子节点行为一致。由于 portal 仍存在于 React 树, 且与 DOM 树 中的位置无关,那么无论其子节点是否是 portal,像 context 这样的功能特性都是不变的。
这包含事件冒泡。一个从 portal 内部触发的事件会一直冒泡至包含 React 树*的祖先,即便这些元素并不是 *DOM 树 中的祖先
通俗来讲就是假设父节点app-root 通过 ReactDOM.createPortal 将它的子节点,挂载到它的兄弟节点modal-root上,父节点app-root的Partal组件仍然能狗捕获到该子节点冒泡上来的事件。
下面来实现一个建议的弹窗功能
创建Portal插槽组件MsgConten
import React from 'react';
import ReactDOM from "react-dom"; class Model extends React.Component{ constructor(props) {
super(props);
this.el = document.createElement('div');
this.modelRoot = document.getElementById('model-root');
} componentDidMount(){
//将插入弹窗的div放入到兄弟节点“model-root”中
this.modelRoot.appendChild(this.el);
}
//清理工作
componentWillUnmount() {
this.modelRoot.removeChild(this.el);
}
render() {
return ReactDOM.createPortal((//将创建好的弹窗插入到创建的div元素中
<MsgWindow closeModel={this.props.closeModel}/>
), this.el);
}
}
//弹窗
function MsgWindow(props) {
return(
<div className={'cover'} style={{background:'grey',width:'200px',height:'200px',margin: '0 auto'}}>
<button onClick={props.closeModel}>关闭</button>
<div style={{color:'#ffffff'}}>
我是app-root的子节点,但被渲染在它的兄弟节点model-root上
</div>
</div>
)
} export default Model;
创建两个兄弟节点app-root和model-root
import React,{Component} from 'react';
import Model from './MsgConten';
class Portals extends Component{
state={
showMsg:false
};
handleMsgWindow(){
this.setState({
showMsg:!this.state.showMsg
})
}
render() {
return (
<>
<div id={"app-root"} >
{(this.state.showMsg == true)?<Model isShow={this.state.showMsg} closeModel={this.handleMsgWindow.bind(this)}/>:null}
<button onClick={this.handleMsgWindow.bind(this)}>portals</button>
</div>
<div id={"model-root"}></div>
</>
)
}
}
export default Portals;
运行效果如下


react portals 插槽 实现简易弹窗的更多相关文章
- react portals
来源:https://segmentfault.com/a/1190000011668286 Portals是react 16.3 提供的官方解决方案,使得组件可以脱离父组件层级挂载在DOM树的任何位 ...
- react 全局公共组件-----动态弹窗 (dialog)
react 的时候,总是会用到弹窗,并且各种各样的,一般来说,组件层级嵌套之后,就会出现 z-index层级覆盖的问题 这个时候,就需要一个公共的弹出层,然后我们将需要展示的组件,放到弹出层里面 下面 ...
- react中使用redux简易案例讲解
为什么我想要使用redux? 前段时间初步上手了react,最近在使用react的过程中发现对于组件之间通信的需求比较迫切,尤其是在axios异步请求后端数据的时候,这样的需求是特别强烈的!举个例子: ...
- 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer
基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...
- React Native之持久化存储(AsyncStorage、react-native-storage)的使用
AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它对于App来说是全局性的.这是官网上对它的介绍.可以知道,这个asyncstorage也是以键值对的形式进行存储数据 ...
- [React] react-interview-01
1.render 函数中 return 如果没有使用()会有什么问题? 我们在使用 JSX 语法书写 react 代码时,babel 会将 JSX 语法编译成 js,同时会在每行自动添加分号(:),如 ...
- React 系列教程2:编写兰顿蚂蚁演示程序
简介 最早接触兰顿蚂蚁是在做参数化的时候,那时候只感觉好奇,以为是很复杂的东西.因无意中看到生命游戏的 React 实现,所以希望通过兰顿蚂蚁的例子再学习一下 React. 兰顿蚂蚁的规则非常简单: ...
- React 精要面试题讲解(五) 高阶组件真解
说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...
- Smobiler实现手机弹窗
前言 在实际项目中有很多场景需要用到弹窗,如图1 那么这些弹窗在Smobiler中如何实现呢? 正文 Smobiler实现弹窗有两种方式:1.MessageBox.Show 2.ShowDialog和 ...
随机推荐
- oracle-密码
Oracle 11g 默认用户名和密码安装ORACLE时,若没有为下列用户重设密码,则其默认密码如下: 用户名/密码 登录身份 说明sys/change_on_install SYSDBA 或 SYS ...
- linux安装npm遇到权限问题 permission denied
--unsafe-per
- Cinder LVM Oversubscription in thin provisioning
目录 文章目录 目录 Oversubscription in thin provisioning Oversubscription in thin provisioning Cinder spec: ...
- 03Flutter仿京东商城项目 封装适配库以及实现左右滑动ListView
ScreenAdaper.dart import 'package:flutter_screenutil/flutter_screenutil.dart'; class ScreenAdaper { ...
- [Scikit-learn] Dynamic Bayesian Network - Conditional Random Field
李航,第十一章,条件随机场 参考:[PGM] Markov Networks 携代码:用 Python 通过马尔可夫随机场(MRF)与 Ising Model 进行二值图降噪[推荐!] CRF:htt ...
- PyQt5 调用 View 视图的方法
一.使用Qt Designer 1. 直接引用ui文件: from PyQt5.uic import loadUi class MainWindow(QDialog): def __init__(se ...
- .Netcore 2.0 Ocelot Api网关教程(10)- Headers Transformation
本文介绍Ocelot中的请求头传递(Headers Transformation),其可以改变上游request传递给下游/下游response传递给上游的header. 1.修改ValuesCont ...
- X-Forwarded-For注入漏洞实战
准备工具 Burp suite Sqlmap 实训目标 1.掌握SQL注入的基本原理:2.了解服务器获取客户端IP的方式:3.了解SQL注入的工具使用: 解题方向 对登录表单的各参数进行测试,找到SQ ...
- DNS域名解析系统_1
DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...
- Debezium系列随笔
0.Debezium简介 1.Run Debezium for Mysql in docker step by step 2.Run Debezium for SQLServer in docker ...