使用React手写一个对话框或模态框的方法示例


Posted in Javascript onApril 25, 2019

打算用React写对话框已经很长一段时间,现在是时候兑现承诺了。实际上,写起来相当简单。

核心在于使用React的接口React.createPortal(element, domContainer)。该接口将element渲染后的DOM节点嵌入domContainer(通常是document.body),并保证只嵌入一次。

所以,我们可以这样写一个对话框或模态框:

function Dialog() {
  return React.createPortal( <div>Dialog contents</div>, document.body )
}

一个新的div会出现在body内部:

使用React手写一个对话框或模态框的方法示例

一个完整DEMO:

使用React手写一个对话框或模态框的方法示例

点击运行DEMO

class Modal extends React.Component {
 render() {
  const {
   visible,
   onClose
  } = this.props
  return visible && ReactDOM.createPortal(<StyledModalRoot>
   <div className="box">
    Content
    <br/>
    <button onClick={onClose}>Close</button>
   </div>
  </StyledModalRoot>, document.body)
 }
}

class App extends React.Component {
 state = {
  visibleModal: false
 }
 showModal = () => this.setState( { visibleModal: true } )
 handleCloseModal = () => this.setState( { visibleModal: false } )
 render() {
  const { visibleModal } = this.state
  return <div style={{padding: '20px'}}>
  <button onClick={ this.showModal }>Show Modal</button>
  <Modal visible={visibleModal} onClose={ this.handleCloseModal } />
 </div>
 }
}

const StyledModalRoot = styled.div`
 position: fixed;
 z-index: 1001;
 left: 0;
 top: 0;
 display: grid;
 place-items: center;
 width: 100%;
 height: 100%;
 background: rgba( 0, 0, 0, 0.2 );

 >.box {
  position: relative;
  display: grid;
  place-items: center;
  width: 80%;
  height: 80%;
  background: white;
  border-radius: 10px;
  box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 5px 8px 0px rgba(0,0,0,0.14), 0px 1px 14px 0px rgba(0,0,0,0.12);
 }
`

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js小数运算出现多位小数如何解决
Oct 08 Javascript
Bootstrap CSS使用方法
Dec 23 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
JS实现换肤功能的方法实例详解
Jan 30 Javascript
jQuery层叠选择器用法实例分析
Jun 28 jQuery
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
Sep 21 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 Javascript
vue渲染方式render和template的区别
Jun 05 Javascript
谈一谈vue请求数据放在created好还是mounted里好
Jul 27 Javascript
vue 动态创建组件的两种方法
Dec 31 Vue.js
elementUI Tree 树形控件的官方使用文档
Apr 25 #Javascript
微信小程序Flex布局用法深入浅出分析
Apr 25 #Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 #Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 #Javascript
微信小程序整合使用富文本编辑器的方法详解
Apr 25 #Javascript
微信小程序实现的五星评价功能示例
Apr 25 #Javascript
微信小程序实现单列下拉菜单效果
Apr 25 #Javascript
You might like
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
Python的re模块正则表达式操作
2016/05/25 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
咨询公司各岗位职责
2013/12/02 职场文书
五年级英语教学反思
2014/01/31 职场文书
幼儿教师培训感言
2014/03/08 职场文书
总经理工作职责范文
2014/03/14 职场文书
倡导文明标语
2014/06/16 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
创卫工作总结2015
2015/04/22 职场文书
民事代理词范文
2015/05/25 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python