uniapp项目或者vue项目 封装弹框组件

baseDialog组件代码:

<template>
	<view class="base-dialog" v-if="show">
		<view class="mask"></view>
		<view class="Popmenu" :style="{ width }">
			<view class="header">{
         
  { title }}</view>
			
			<view class="content">
				<slot></slot>
			</view>
			
			<view v-if="cancelShow || confirmShow" class="btns">
				<myButton :type=cancelType style="margin-right: 24rpx" v-if="cancelShow" @click.stop="cancel">{
         
  { cancelText }}</myButton>
				<myButton :type=confirmType v-if="confirmShow" @click.stop="confirm">{
         
  { confirmText }}</myButton>
			</view>
		</view>
	</view>
</template>

<script>
	import myButton from ../components/myButton.vue
	export default {
		props: {
			title: {
				type: String,
				default: 
			},
			show: {
				type: Boolean,
				default: false
			},
			cancelText: {
				type: String,
				default: 取消
			},
			confirmText: {
				type: String,
				default: 确定
			},
			cancelShow: {
				type: Boolean,
				default: true
			},
			confirmShow: {
				type: Boolean,
				default: true
			},
			cancelDisabled: Boolean,
			confirmDisabled: Boolean,
			width: {
				type: [String | Number],
				default: 100%
			},
			
			cancelType: String,
			confirmType: String
		},
		components: {
			myButton
		},
		computed: {
			_show: {
				get() {
					return this.show;
				},
				set(v) {
					console.log(v)
					this.$emit(update:show, v);
				}
			}
		},
		methods: {
			confirm() {
				if(this.confirmDisabled) return;
				
				this.$emit(confirm);
				this._show = false;
			},
			cancel() {
				if(this.cancelDisabled) return;
				this.$emit(cancel);
				this._show = false;
			}
		}
	}
</script>

<style lang=scss>
.base-dialog {
	position: fixed;
	width: 100%;
	height: 100%;
	left: 0;
	top: 0;
	z-index: 20;
	transition:opacity 1s linear;
	.mask{
		background-color:rgba(0, 0, 0, 0.9);
		opacity: 0.5;
		position: absolute;
		width: 100%;
		height: 100%;
		left: 0;
		top:0;
	}
	
	.Popmenu {
		border-radius: 24rpx;
		padding: 40rpx;
		box-sizing: border-box;
		background: white;
		position: absolute;
		left: 50%;
		top: 45%;
		transform: translate(-50%, -50%);
		
		.header {
			text-align: center;
			margin-bottom: 24rpx;
			font-size: 40rpx;
		}
		
		.content {
			margin-bottom: 40rpx;
		}
	}
	
	.btns {
		display: flex;
		align-items: center;
		justify-content: center;
	}
}
</style>

在data定义弹框显示与隐藏 infoShow: false, // 榜单规则

引入组件:

经验分享 程序员 微信小程序 职场和发展