自己使用react写一个弹框组件(2)

之前上一篇文章讲了一些动画的实现,现在正式总结使用react搭一个modal的过程,在这个理我使用create-react-app来创建react app。

import React from 'react';
import PropTypes from 'prop-types'
import './SevenModal.css'
class SevenModal extends React.Component {

  render() {
    return (
        <div className="sevenmodal-wrapper">
          {
              <div className="sevenmodal">
                <div className="sevenmodal-title">这是modal标题</div>
                <div className="sevenmodal-content">这是modal内容</div>
                <div className="sevenmodal-operator">
                  <button className="sevenmodal-operator-close">取消</button>
                  <button className="sevenmodal-operator-confirm">确认</button>
                </div>
              </div>
              <div className="sevenmodal-mask"></div> 
          }
        </div> 
    )
  }
}
SevenModal.defaultProps = {}
SevenModal.propTypes = {}
  
export default SevenModal

这是写一个react'组件的基础模式,需要的文件有SevenModal.css, 这是放css样式的地方。

加上回调事件以及相关属性

要使弹框组件能够正常关闭,需要一个能控制它显示和关闭的属性,visable,以及两个回调事件,即点击确认和点击取消的两个回调事件。

state = { visible: false, }

/*

  ........

*/
SevenModal.defaultProps = {}
SevenModal.propTypes = {
  visible: PropTypes.bool,
  onConfirm: PropTypes.func,
  onClose: PropTypes.func
}
  

回调事件是react父子组件间通讯方式之一,子组件调用从父组件传下来的回调函数(通常作为props传给子组件),父组件的相关函数就执行了,如果把参数传入回调函数内,父组件的相应函数也能接收到

closeModal = () => {
    const { onClose } = this.props
    onClose && onClose()
    this.setState({
      visable: false,
    })
}

confirmModal = () => {
    const { onConfirm } = this.props
    onConfirm && onConfirm()
    this.setState({
        visable: false,
    })
}

将这两个写好的函数绑定在确认和取消的onClick事件里边。visable作为控制弹框显示关闭的一个状态。

render() {
       <div className="sevenmodal-wrapper">
          {
            visible &&
            <div>
              <div className={`sevenmodal ${classes}`}>
                <div className="sevenmodal-title">这是modal标题</div>
                <div className="sevenmodal-content">这是modal内容</div>
                <div className="sevenmodal-operator">
                  <button className="sevenmodal-operator-close" onClick={this.closeModal}>取消</button>
                  <button className="sevenmodal-operator-confirm" onClick={this.confirmModal}>确认</button>
                </div>

              </div>
              <div className={`sevenmodal-mask ${maskClasses}`} onClick={this.maskClick}></div> 
            </div>
          }
        </div> 
}

样式

样式是由两部分组成,一部分是modal组件主体的内容,即modal的标题和内容,以及确认和取消按钮。还有一部分是蒙层。两部分都采用fixed作为position,因为这两部分都是针对于body布局,而fixed正式一种基于body移动的absolute。同时设定两个z-index都在9000以上,这样保证了两个div都是在最上面显示。但是modal主体的div的zindex只要比蒙层的div多个一点点就可以了。

.sevenmodal {
  position: fixed;
  width: 300px;
  height: 200px;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  border-radius: 5px;
  background: #fff;
  overflow: hidden;
  z-index: 9999;
  box-shadow: inset 0 0 1px 0 #000;
}
.sevenmodal-mask {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: #000;
  opacity: .6;
  z-index: 9998;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,524评论 1 33
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,609评论 0 7
  • 1.Typescript中的&理解 参数中的 & 表示props对象同时拥有了TagManagementState...
    Lethe35阅读 7,682评论 0 1
  • 杭州的工作压力越来越大,脱贫脱单是我目前的困境。没有男朋友,工作能力也不强的我。在杭州的生活捉襟见肘,寅吃卯粮,名...
    阿依吉吉阅读 206评论 0 0
  • 这有鹰隼,还是一群! 加入鹰隼部落已经4个多月了,我见识了太多的牛人! 在这里,有驭器者杨隆恺老师,他的《转智成规...
    昊丹琪烨阅读 347评论 0 0