vue3实现单文件命令式弹窗组件

所需依赖

yarn add @styils/vue

调用的页面

<template>
  <div class="home">
	<el-button type="primary" @click="handleMessage">提示</el-button>
  </div>
</template>

<script lang="ts" setup>
	import showMsg from '@/utils/showMsg';
	const handleMessage = () => {
		showMsg('命令式组件!', (done?: () => void) => {
			done && done();
		})
	}
</script>

utils/showMsg.js

import { createApp } from 'vue'
import { styled } from '@styils/vue'

const wrapperDiv = styled('div', {
	position: 'fixed',
	width: '100%',
	height: '100%',
	left: 0,
	right: 0,
	top: 0,
	bottom: 0,
	zIndex: 999,
	background: '#00000050',
	display: 'flex',
	justifyContent: 'center',
	alignItems: 'center',
})
const boxDiv = styled('div', {
	backgroundColor: '#ffffff',
	color: '#333',
	padding: '30px 30px',
	borderRadius: '10px',
	width: '300px',
	display: 'flex',
	flexDirection: 'column',
	justifyContent: 'center',
	alignItems: 'center',
})
	

const tipDiv = styled('div', {
	marginBottom: '20px'
})

const messageBox = {
	props: {
		message: {
			type: String,
			default: '',
			require: true
		}
	},
	render(ctx) {
		const { $props, $emit } = ctx
		return (<wrapperDiv>
			<boxDiv>
				<tipDiv>{$props.message}</tipDiv>
				<button click={$emit('onClick')}>关闭</button>
			</boxDiv>
		</wrapperDiv>)
	}
}

function showMsg(message, callBack) {
	const div = document.createElement('div')
	document.body.appendChild(div)
	const app = createApp(messageBox, {
		message,
		onClick() {
			if (!callBack) {
				app.unmount()
				div.remove()
			} else {
				callBack(() => {
					app.unmount()
					div.remove()
				})
			}
		}
	})
	app.mount(div)
}

export default showMsg
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值