使用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 相关文章推荐
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
jQuery图片的展开和收缩实现代码
Apr 16 Javascript
jQuery根据元素值删除数组元素的方法
Jun 24 Javascript
javascript实现抽奖程序的简单实例
Jun 07 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
a标签置灰不可点击的实现方法
Feb 06 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
Jun 01 Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 Javascript
javascript将非数值转换为数值
Sep 13 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
js获取 gif 的帧数的代码实例
Sep 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 escape URL编码
2008/12/10 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
php简单获取复选框值的方法
2016/05/11 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
PHP实现简单登录界面
2019/10/23 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
高中生学习生活的自我评价
2013/11/27 职场文书
班级体育活动总结
2014/07/05 职场文书
三八活动策划方案
2014/08/17 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
交通事故被告代理词
2015/05/23 职场文书
党员反邪教心得体会
2016/01/15 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
入党心得体会
2019/06/20 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python