React中怎么封装全局弹框,具体过程是怎样
Admin 2022-06-23 群英技术资讯 957 次浏览
今天这篇给大家分享的知识是“React中怎么封装全局弹框,具体过程是怎样”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“React中怎么封装全局弹框,具体过程是怎样”文章能帮助大家解决问题。本文实例为大家分享了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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章我们来了解jQuery如何改变对象的值,这里使用val()方法来实现,实现代码如下,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!
这篇文章主要介绍了关于vue中的时间格式转化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章给大家分享的是有关nodejs错误处理过程的内容。小编觉得挺实用的,下文有具体实例可以个参考,感兴趣的朋友不妨跟随小编一起看看吧。
这篇文章主要介绍了javascript条件式访问属性和箭头函数,下面文章围绕条件式访问属性和箭头函数的相关资料展开文章内容,需要的朋友可以参考一下
这篇文章主要介绍了Vue+scss白天和夜间模式切换功能的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008