React中怎么封装全局弹框,具体过程是怎样
Admin 2022-06-23 群英技术资讯 359 次浏览
本文实例为大家分享了react封装全局弹框的具体代码,供大家参考,具体内容如下
弹框效果图
文件布局
index.js
/* eslint-disable react/no-render-return-value */ import React, { Component } from 'react' import { is, fromJS } from 'immutable' import ReactDOM from 'react-dom' import './alert.less' const close = require('../images/guanbi.png') const line = require('../images/line.png') const defaultState = { alertStatus: false, alertTip: null, alertTitle: '详情', closeAlert: () => {} } class Toptips extends Component { state = { ...defaultState } // css动画组件设置为目标组件 FirstChild = props => { const childrenArray = React.Children.toArray(props.children) return childrenArray[0] || null } // 关闭弹框 confirm = () => { const that = this console.log(that) this.setState( { alertStatus: false }, () => { that.state.closeAlert() } ) } open = data => { const options = data || {} options.alertStatus = true this.setState({ ...defaultState, ...options }) } close = () => { const that = this that.state.closeAlert() this.setState({ ...defaultState }) } shouldComponentUpdate = (nextProps, nextState) => { return ( !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState)) ) } render() { const { alertStatus, alertTip, alertTitle } = this.state console.log(alertTip, alertTitle) return ( <div className="alert-con" style={alertStatus ? { display: 'block' } : { display: 'none' }} > <div className="alert-context"> <div className="alert-content-title">{alertTitle}</div> <img className="alert-content-line" src={line} alt="line" /> <div className="alert-content-detail">{alertTip}</div> <img role="presentation" onClick={() => { this.confirm() }} className="alert-close" src={close} alt="关闭" /> </div> </div> ) } } const div = document.createElement('div') const props = {} document.body.appendChild(div) const Box = ReactDOM.render(React.createElement(Toptips, props), div) export default Box
less
.alert-con { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.3); z-index: 222; } .alert-context { // background-color: #fff; // border-radius: 16px; position: relative; // height: 500px; height: 90%; width: 750px; margin: 40px auto 0; background: url(../images/alertBJ.png) no-repeat center; background-size: 100% 100%; .alert-close{ width: 30px; height: 30px; position: absolute; right: 30px; top: 30px; } .alert-content-title{ width: 100%; height: 80px; line-height: 80px; color: #fff; text-align: center; font-size: 36px; font-weight: bolder; // background: url(../images/line.png) no-repeat left bottom; } .alert-content-line{ width: 100%; height: 20px; margin-top: -44px; margin-left: -6px; } .alert-detais-list{ width: 102%; height: 100%; overflow-y: auto; padding: 20px 60px; .alert-detais-list-C{ p{ &:nth-child(1){ font-size: 14px; line-height: 20px; color: #FFFFFF; letter-spacing: 1.4px; } &:nth-child(2){ line-height: 24px; font-size: 18px; color: #FFFFFF; } } } } .alert-content-detail{ // height: 100%; height: calc(100% - 100px); /* overflow-y: auto; */ overflow: hidden; width: 98%; margin-top: -26px; } .alert-details-pdf{ width: 102%; height: 100%; overflow-y: auto; padding: 20px 60px; .alert-details-button{ display: flex; flex-direction: row; justify-content: flex-end; margin-bottom: 10px; p{ color:#fff; line-height: 35px; font-size: 16px; margin-right: 20px; } a{ line-height: 35px; font-size: 16px; margin-right: 20px; } } } .cameraWrap{ width: 100%; height: 102%; box-sizing: border-box; padding: 12px 4px 0 14px; } }
用法
import Toptips from "./Toptips" Toptips.open({ alertTitle: '批示详情', alertTip: that.htms(val), closeAlert: function () { console.log("关闭了..."); } }); htms = val => { return (<div className="alert-detais-list"> <div className="alert-detais-list-C"> <p>批示内容:</p> <p>{val.fdTitle}</p> </div> <div className="alert-detais-list-C"> <p>批示详述:</p> <p>{val.fdTitle}</p> </div> <div className="alert-detais-list-C"> <p>措施及结果:</p> <p>{val.fdContent}</p> </div> <div className="alert-detais-list-C"> <p>进度详情:</p> <p></p> </div> </div>) }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
其实在很多文章都会写call,apply,bind,但个人觉着如果不弄懂原理,是很难理解透的,所以这篇文章主要介绍了JavaScript中call、apply、bind实现原理的相关资料,需要的朋友可以参考下
这篇文章主要介绍了Vue3 $emit用法指南,使用 emit,我们可以触发事件并将数据传递到组件的层次结构中,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
移动端开发的过程中,一个最常见的问题就是适配不同的屏幕宽度。本文主要介绍了webpack的移动端适配方案,感兴趣的可以了解一下
这篇文章主要介绍了JS关于for循环中使用setTimeout的四种解决方案,想深入了解JS的同学,一定要继续往下看
本文实例讲述了JavaScript中继承原理与用法。分享给大家供大家参考,具体如下:
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008