使用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 相关文章推荐
filemanage功能中用到的lib.js
Apr 08 Javascript
IE不出现Flash激活框的小发现的js实现方法
Sep 07 Javascript
兼容ie和firefox js关闭代码
Dec 11 Javascript
javascript 短路法代码精简
Aug 20 Javascript
学习javascript,实现插入排序实现代码
Jul 31 Javascript
目前流行的JavaScript库的介绍及对比
Sep 29 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
去除字符串左右两边的空格(实现代码)
May 12 Javascript
浅谈json取值(对象和数组)
Jun 24 Javascript
详解vue静态资源打包中的坑与解决方案
Feb 05 Javascript
vue.js select下拉框绑定和取值方法
Mar 03 Javascript
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 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
js实现圆盘记速表
2015/08/03 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python之reload流程实例代码解析
2018/01/29 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python中实现控制小数点位数的方法
2019/01/24 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
python conda操作方法
2019/09/11 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
生活小常识广播稿
2014/09/16 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
教育合作协议范本
2014/10/17 职场文书
2014个人年度工作总结
2014/12/15 职场文书
房屋所有权证明
2015/06/19 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书