使用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 ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
Jun 27 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
AngularJS动态生成div的ID源码解析
Aug 29 Javascript
Vue 父子组件、组件间通信
Mar 08 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 jQuery
Flutter实现仿微信底部菜单栏功能
Sep 18 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
Aug 14 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代码技巧的小结
2013/06/02 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
python编写弹球游戏的实现代码
2018/03/12 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
python学生管理系统学习笔记
2019/03/19 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
如何对python的字典进行排序
2020/06/19 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
离职报告范文
2014/11/04 职场文书
贷款担保书
2015/01/20 职场文书
学生病假条怎么写
2015/08/17 职场文书
导游带团欢迎词
2015/09/30 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电