当前位置: 首页 > Web前端 > CSS

React+TS免注册DOM页面弹窗

时间:2023-03-31 11:18:32 CSS

背景在日常的需求开发中,我们经常需要用到弹窗,所以我们在构建弹窗的时候,需要在引用组件的时候引入组件DOM,然后通过事件来控制组件的隐藏显示,调用是不是很方便;本组件使用预注册的DOM方法,业务方在使用时直接调用暴露的方法即可,无需引用DOM。示例组件使用示例importnewDialogfrom"*./components/newDialog"newDialog.open({title:"退出发布",content:'是否要保存草稿箱?',btn:[{text:"不要save"},{text:"Save"}],callback:(event)=>{if(event.result==2){//TODO}else{//TODO}}});API参数描述类型必填titlebomb窗口标题String√content弹窗显示内容String\ReactDom√btn弹窗按钮可配置一个或两个Array√callback弹窗响应回调方法Function√弹窗按钮说明//弹出按钮是一个json数组配置,最多配置两个Abtn:[{text:"Donotsave"},{text:"Save"}],//每个按钮只需要配置text按钮的样式和颜色可以集成到css中//如果配置一个按钮,会在底部长按钮配置两个回调参数,按照配置的数组顺序从左到右显示//点击返回回调数据并关闭弹窗的按钮{result:1/2//返回按钮的索引值}完整代码js代码newDialog.tsx'usestrict';import'./newDialog.scss';import*从'react'作为React;从“classnames”导入cs;从'react-dom'导入*作为ReactDOM;从'./导入{isIphoneX}../../util/util';/***@description解决移动端滚动穿透事件**/constModalHelper=(function(bodyCls){varscrollTop;return{afterOpen:function(){scrollTop=document.scrollingElement.scrollTop;文档.body.classList.add(bodyCls);document.body.style.top=-scrollTop+'px';},beforeClose:function(){document.body.classList.remove(bodyCls);//设置position:fixed后scrollTop丢失,将其恢复。document.scrollingElement.scrollTop=scrollTop;}};})('modal-open');interfaceIAppProps{title?:string;内容?:任何;btn?:任何;回调?:函数;}接口IAppState{showToast?:布尔值;标题?:字符串;内容?:任何;btn?:任何;回调?:功能;isIPhoneX?:Boolean;}letDialogDiv;classDialogextendsReact.Component{constructor(props:IAppProps){super(props);}this.state={showToast:true,isIPhoneX:false};}componentWillMount(){让isIPhoneX=isIphoneX();this.setState({isIPhoneX});}staticopen=(options)=>{const{...props}=options||{};DialogDiv=document.createElement('div');setTimeout(()=>{document.body.appendChild(DialogDiv);ReactDOM.render(,DialogDiv);},100);ModalHelper.afterOpen();}close=(param)=>{letresult=param+1;this.props.callback({result:result});this.setState({showToast:false});document.body.removeChild(DialogDiv);ModalHelper.beforeClose();}render(){const{showToast,isIPhoneX}=this.state;const{标题,内容,btn}=this.props;让_twoBtn=btn.length>1?真假;return({title}

{content}
{btn.map((item,idx)=>{return({this.close(idx);//item.callback();}}className={cs('dialog-btn',{margin_r:_twoBtn&&idx==0,默认值:_twoBtn&&idx==0})}>{item.text}
);})}
)}}exportdefaultDialog;css代码newDialog.scss$baseFontSize:16px!default;//像素到rems@functionpxToRem($px){@return$px/$baseFontSize*1rem;}.dialog-container{位置:固定;顶部:0;左:0;右:0;底部:0;背景:rgba(0,0,0,.7);显示:无;z-指数:9999;&.show{显示:块;}}.new-dialog-box{宽度:100%;最小高度:pxToRem(195px);背景:rgba(255,255,255,1);位置:绝对;框大小:边框框;保证金:0;底部:0;z-ind例如:9999;过渡:全部0.3s;边界半径:pxToRem(8px)pxToRem(8px)00;//显示:弹性;.dialog-title{字体大小:pxToRem(19px);边距:pxToRem(25px)autopxToRem(25px);文本对齐:居中;字体系列:PingFangSC-Medium,PingFangSC;字体粗细:500;颜色:rgba(51,51,51,1);行高:pxToRem(19px);}.dialog-content{填充:0pxToRem(25px);字体大小:pxToRem(14px);字体系列:PingFangSC-Regular,PingFangSC;颜色:rgba(51,51,51,1);保证金:0自动pxToRem(15px);文本对齐:居中;颜色:rgba(0,0,0,1);行高:pxToRem(27px);最小高度:pxToRem(50px);}.dialog-bottom{高度:pxToRem(45px);填充:0pxToRem(20px);底部边距:pxToRem(15px);显示:弹性;&.isIPhoneX{margin-bottom:pxToRem(49px);}}.拨号og-btn{//边距:0autopxToRem(30px);//宽度:pxToRem(300px);弹性:1;高度:pxToRem(45px);背景图像:线性渐变(-44deg,#FCAF3C0%,#F2522898%);框阴影:08px14px0rgba(190,118,22,0.20);边界半径:pxToRem(45px);文本对齐:居中;行高:pxToRem(45px);大小:pxToRem(15px);字体系列:PingFangSC-Medium,PingFangSC;颜色:rgba(255、255、255、1);&.margin_r{margin-right:pxToRem(24px);}&.default{背景:#FFFFFF;边框:1px实心#E6E6E6;框阴影:010px20px-8pxrgba(173,173,173,0.30);边界半径:pxToRem(45px);字体大小:pxToRem(15px);-SC-Medium、PingFang-SC;颜色:rgba(85、85、85、1);另外在代码中附上iPhoneX系列机型判断方法exportconstisIphoneX=function(){//iPhoneX、iPhoneXSvarisIPhoneX=/iphone/gi.test(window.navigator.userAgent)&&window.devicePixelRatio&&window.devicePixelRatio===3&&window.screen.width===375&&window.screen.高度===812;//iPhoneXSMaxvarisIPhoneXSMax=/iphone/gi.test(window.navigator.userAgent)&&window.devicePixelRatio&&window.devicePixelRatio===3&&window.screen.width===414&&window.screen.height===896;//iPhoneXRvarisIPhoneXR=/iphone/gi.test(window.navigator.userAgent)&&window.devicePixelRatio&&window.devicePixelRatio===2&&window.screen.width===414&&window.screen.height===896;如果(isIPhoneX||isIPhoneXSMax||isIPhoneXR){返回真;}返回假;}