uniapp 自定义弹窗组件
先上效果:

组件源码:slot-modal.vue
<template>
	<view class="modal-container" v-if="show" @click.stop="cancel(2)">
		<view class="modal-content">
			<view class="modal-head modal-title-padding">
				<slot name="modal-head"></slot>
			</view>
			<view class="modal-body">
				<slot name="modal-body"></slot>
			</view>
			<view class="modal-footer">
				<view class="modal-col" hover-class="modal-hover" v-if="cancelText" @click.stop="cancel('cancel')">
					<text :style="cancelStyle" class="modal-row-text">{{cancelText}}</text>
				</view>
				<view :style="confirmStyle" class="modal-col modal-confirm" hover-class="modal-hover" @click.stop="confirm">
					<text :style="confirmStyle" class="modal-row-text">{{confirmText}}</text>
				</view>
			</view>
		</view>
	</view>
</template>
<script>
	export default {
		name: 'modal',
		props: {
			//默认是否显示
			show: {
				type: Boolean,
				default: true
			},
			//取消按钮文字
			cancelText: {
				type: String,
				default: ''
			},
			//取消样式
			cancelStyle: {
				type: [String, Object]
			},
			//确定按钮文字
			confirmText: {
				type: String,
				default: '确定'
			},
			//确定样式
			confirmStyle: {
				type: [String, Object]
			},
			//阻止点击对话框外侧锁屏
			disableScreenClick: {
				type: Boolean,
				default: false
			}
		},
		methods: {
			confirm() {
				this.$emit('confirm')
			},
			cancel(type) {
				if (!this.disableScreenClick || type === 'cancel') {
					this.$emit('cancel')
				}
			}
		}
	}
</script>
<style lang="scss" scoped>
	$fontSizeLg:17px;
	$fontSizeSm:15px;
	.modal-container {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 999;
		background-color: rgba(0, 0, 0, .6);
		transition: all 5s;
		display: flex;
		align-items: center;
		justify-content: center;
		.modal-content {
			width: 80%;
			border-radius: 26rpx;
			background: #FFFFFF;
			overflow: hidden;
			animation: fadeZoom .15s linear;
			.modal-head {
				padding: 30rpx 30rpx 0;
				text-align: center;
				color: #000;
				font-size: $fontSizeLg;
				font-weight: 700;
			}
			.modal-title-padding {
				padding-bottom: 30rpx;
			}
			.modal-body {
				overflow:auto;
				padding: 40rpx 30rpx;
				font-size: $fontSizeSm;
				color: #000;
				text-align: center;
			}
			.modal-footer {
				display: flex;
				position: relative;
				text-align: center;
				font-size: $fontSizeLg;
				line-height: 100rpx;
				color: #007AFF;
				border-top: 0.5px solid rgba(9, 20, 31, 0.13);
				.modal-col {
					flex: 1;
					width: 100%;
					position: relative;
				}
				.modal-col:first-child::after {
					content: '';
					position: absolute;
					top: 0;
					bottom: 0;
					right: 0;
					border-right: 1px solid rgba(9, 20, 31, 0.13);
					transform: scaleX(.36);
				}
				.modal-confirm {
					color: rgb(0, 122, 255);
				}
				.modal-hover {
					background-color: #f2f2f2;
				}
			}
			.modal-footer::after {
				content: '';
				position: absolute;
				left: 0;
				right: 0;
				top: 0;
				border-top: 0.5px solid rgba(9, 20, 31, 0.13);
				transform: scaleY(.36);
			}
		}
		@keyframes fadeZoom {
			0% {
				transform: scale(.7);
				opacity: .6;
			}
			80% {
				transform: scale(1.2);
				opacity: .3;
			}
			100% {
				transform: scale(1);
				opacity: 1;
			}
		}
	}
</style>
使用示例:
<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{title}}</text>
		</view>
		<view><button type="default" @click="privacyDialogShow=true">用户协议</button></view>
		<slot-modal
			class="modal-privacy"
			:show="privacyDialogShow"
			:disableScreenClick="true"
			confirmText="同意"
			cancelText="不同意"
			@cancel="cancelPrivacy"
			@confirm="confirmPrivacy">
			<template slot="modal-head">
				<text>用户协议及隐私政策</text>
			</template>
			<template slot="modal-body">
				<view class="index-content">
					<text>
						我们非常重视隐私和个人信息保护,请您先认真阅读
						<text class="privacyPolicy" @click.stop="goPage('agreement')">《用户服务协议》</text>和
						<text class="privacyPolicy" @click.stop="goPage('privacy')">《隐私政策》</text>的全部条款,接受全部条款后再开始使用我们的服务。
						<text v-for="item in 40">我们非常重视隐私和个人信息保护,请您先认真阅读我们非常重视隐私和个人信息保护,请您先认真阅读我们非常重视隐私和个人信息保护,请您先认真阅读</text>
					</text>
				</view>
			</template>
		</slot-modal>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				title: 'Hello',
				privacyDialogShow:false
			}
		},
		onLoad() {
		},
		methods: {
			goPage(pageUrl){
				console.log(pageUrl)
				uni.navigateTo({
					url:'../agreement/agreement'
				})
			},
			confirmPrivacy(){
				console.log('同意了用户协议')
				console.log(this.privacyDialogShow)
				this.privacyDialogShow = false
				console.log(this.privacyDialogShow)
			},
			cancelPrivacy(){
				console.log('拒绝了用户协议')
				this.privacyDialogShow=false
			}
		}
	}
</script>
<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}
	.text-area {
		display: flex;
		justify-content: center;
	}
	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
	.index-content{
		max-height: 800rpx;
	}
</style>
通过这次学习,遗留了一个问题还未解决:如何限制modal-body的高度为80%,尝试了多种方法无效,只能写固定高度了。
练习了
- (1). 组件自定义事件
- (2). 对话框的css布局
uniapp 自定义弹窗组件的更多相关文章
- 基于JQ的自定义弹窗组件
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- 微信小程序 - 自定义弹窗组件
		2019-01-06:简化了一些代码,以及增加了可用性. // 弹窗配置 dialogConfig: { // 弹窗 dialogvisible: false, options: { // 显示关闭按 ... 
- uni-app自定义Modal弹窗组件|仿ios、微信弹窗效果
		介绍 uniapp自定义弹窗组件uniPop,基于uni-app开发的自定义模态弹窗|msg信息框|alert对话框|confirm确认框|toast弱提示框 支持多种动画效果.多弹窗类型ios/an ... 
- 百度智能小程序弹窗组件wcPop|智能小程序自定义model弹窗模板
		百度智能小程序自定义弹窗组件wcPop|百度小程序model对话框|智能小程序弹窗界面模板 最近百度也推出了自己的智能小程序,如是就赶紧去试了下,官方提供的api还不是狠完整.而且官方提供的弹窗组件也 ... 
- 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer
		基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ... 
- vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件
		基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ... 
- svelte组件:Svelte自定义弹窗Popup组件|svelte移动端弹框组件
		基于Svelte3.x自定义多功能svPopup弹出框组件(组件式+函数式) 前几天有分享一个svelte自定义tabbar+navbar组件,今天继续带来svelte自定义弹窗组件. svPopup ... 
- 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件
		支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ... 
- js实现自定义弹窗
		众所周知,浏览器自带的原生弹窗很不美观,而且功能比较单一,绝大部分时候我们都会按照设计图自定义弹窗或者直接使用注入layer的弹窗等等.前段时间在慕课网上看到了一个自定义弹窗的实现,自己顺便就学习尝试 ... 
随机推荐
- 项目总结—校园办公管理系统(SSM框架搭建)
			文章目录 CSDN下载地址:校园管理系统 GIT下载地址:校园管理系统 学以致用,学习完SSM框架之后,独立完成一个小院办公管理系统,熟悉框架的开发流程,熟悉项目的开发流程,完成一个简单的校园办公管理 ... 
- HttpClient之基本使用
			1.HttpClient简介 http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,特别是现在rest api的流行,Ht ... 
- Spark练习之wordcount,基于排序机制的wordcount
			Spark练习之wordcount 一.原理及其剖析 二.pom.xml 三.使用Java进行spark的wordcount练习 四.使用scala进行spark的wordcount练习 五.基于排序 ... 
- 并发编程(Process对象的join方法)(
			一. Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情况下 ... 
- 搭建tdh平台
			1.卸载tdh平台(见tdh集群卸载文件夹) 在manager节点执行chmod +x uninstall.sh (非root用户执行sudo chmod +x uninstall.sh)开始卸载TD ... 
- Failed to initialize policy for cpu: 0
			今天在使用vmware安装ubuntu16.04的时候出现下列错误: Failed to initialize policy for cpu: 0 (-19),刚开始还以为是镜像文件出现了问题,结果发 ... 
- ACwing 258. 石头剪子布
			258. 石头剪子布 题目传送门 题意挺好理解,但是当我看样例的时候就傻了.不是说好的只有一个裁判的吗?出现矛盾的时候该怎么判定裁判? 分析 观察这个数据量就会发觉是有猫腻的,直接从正面求出裁判并不是 ... 
- vector的几种初始化及赋值方式
			转自https://www.cnblogs.com/quyc/p/12857054.html (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> ... 
- P1714 切蛋糕  dp+单调队列
			题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ... 
- Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
			题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ... 
