使用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画5角星方法介绍
Sep 17 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
JavaScript插件化开发教程 (一)
Jan 27 Javascript
基于jQuery实现的扇形定时器附源码下载
Oct 20 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
php 修改密码实现代码
May 24 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 Javascript
js实现百度登录窗口拖拽效果
Mar 19 Javascript
element中的$confirm的使用
Apr 26 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 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实现session自定义会话处理器的方法
2015/01/27 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
python导入时小括号大作用
2017/01/10 Python
django2 快速安装指南分享
2018/01/05 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
在python中实现对list求和及求积
2018/11/14 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
python如何爬取网页中的文字
2020/07/28 Python
python使用建议技巧分享(三)
2020/08/18 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
共产党员公开承诺书
2014/03/25 职场文书
硕士生找工作求职信
2014/07/05 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
大学生读书笔记范文
2015/07/01 职场文书