使用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 相关文章推荐
jquery实现div阴影效果示例代码
Sep 16 Javascript
无限树Jquery插件zTree的常用功能特性总结
Sep 11 Javascript
jQuery使用元素属性attr赋值详解
Feb 27 Javascript
Node.js刷新session过期时间的实现方法推荐
May 18 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
ES6解构赋值实例详解
Oct 31 Javascript
AngularJS发送异步Get/Post请求方法
Aug 13 Javascript
vue+element 实现商城主题开发的示例代码
Mar 26 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 29 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 字符串替换的方法
2012/01/10 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
使用express获取微信小程序二维码小记
2019/05/21 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
医院辞职信范文
2014/01/17 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
培训感想范文
2015/08/07 职场文书
初中班主任工作随笔
2015/08/15 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
Python简易开发之制作计算器
2022/04/28 Python