react 弹框组件

在这里插入图片描述
请添加图片描述
react没有slot插槽,但是可以直接通过{{props.children}}获取父组件标签中的内容

import React, { Component, useEffect } from 'react';
import { createPortal } from 'react-dom';
import CSSTransition from 'react-transition-group/CSSTransition';
import { Scrollbars } from 'react-custom-scrollbars';
import closePng from '../../static/icon/close.svg';
import './index.css';

function Dialog(props) {
	const { left, top, width, height } = props;
	if (!document.querySelector('#dialog')) {
		const htmlDOM = document.createElement('div');
		htmlDOM.setAttribute('id', 'dialog');
		document.body.appendChild(htmlDOM);
	}
	useEffect(() => {
		if (!document.querySelector('#mask')) {
			const maskDOM = document.createElement('div');
			maskDOM.setAttribute('id', 'mask');
			document.body.appendChild(maskDOM);
		}

		return componentWillUnmount;
	}, []);
	// 移除弹框
	function componentWillUnmount() {
		// 有mask和dialog节点时候再移除
		if (document.querySelector('#mask') && document.querySelector('#dialog')) {
			const dialog = document.getElementById('dialog');
			document.body.removeChild(dialog);
			const mask = document.getElementById('mask');
			document.body.removeChild(mask);
		}
	}
	// 关闭弹框
	function onClose() {
		props.closeDialog(false);
	}

	// 内容
	const html = (
		<div
			className='dialog_box'
			style={{
				position: 'fixed',
				left,
				top,
				width,
				height,
				transform: `translate(-50%,-50%)`,
			}}
		>
			<div className='dialog_header'>
				<div>{props.title}</div>
				<img className='close_icon' width='16' onClick={onClose} src={closePng} alt='x'></img>
			</div>
			<div className='dialog_body'>
				<Scrollbars style={{ height: `100%`, width: `100%` }}>
					<div>{props.children}</div>
				</Scrollbars>
			</div>
		</div>
	);
	// createPortal(html, DOM)可以吧html注册到指定DOM里
	return <>{createPortal(html, document.getElementById('dialog'))}</>;
}
Dialog.defaultProps = {
	// title: '弹框',
	left: '50%',
	top: '40%',
	width: 600,
	height: 400,
};
export default Dialog;

//过度动画包裹着 可以删除
<CSSTransition in={state.isDialog} timeout={500}  classNames='dialog_animation'>
	<>
		{state.isDialog && (
			<Dialog title={'提示'} isDialog={state.isDialog} closeDialog={closeDialogHandle}>
				<div>111</div>
				<button onClick={addHandler}>累加{num}</button>
			</Dialog>
		)}
	</>
</CSSTransition>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值