首页 > 其他分享 >Uni-app的Prompt组件实现

Uni-app的Prompt组件实现

时间:2024-04-16 16:22:22浏览次数:22  
标签:position Prompt bottom app 50% right prompt Uni uni

代码实现

<!-- prompt组件 -->
<template>
	<view>
		<view v-show="show" class="uni-mask" :style="{ top: offsetTop + 'px' }" @touchmove.stop.prevent="maskMoveHandle"></view>
		<view v-show="show" class="prompt-content contentFontColor" :class="'uni-prompt-' + position + ' ' + 'uni-prompt-' + mode">
			<view class="prompt-title">{{title}}</view>
			<input class="prompt-input" type="text" :placeholder="text" @input="_input" :value="cost" />
			<view class="prompt-btn-group">
				<text class="btn-item prompt-cancel-btn contentFontColor" @tap="_cancel">{{btn_cancel}}</text>
				<text class="btn-item prompt-certain-btn" @tap="_confirm">{{btn_certain}}</text>
			</view>
		</view>
		<view v-if="position === 'middle' && mode === 'insert'" :class="{'uni-close-bottom': buttonMode === 'bottom','uni-close-right': buttonMode === 'right'}"
		 class=" uni-icon uni-icon-close" @click="_cancel" />
	</view>
	</view>
</template>
<script>
	export default {
		name: 'prompt',
		data() {
			return {
				offsetTop: 0,
				multipleSlots: true, // 在组件定义时的选项中启用多slot支持
				cost: ''
			};
		},
		props: {
			/**
			 * 页面显示
			 */
			show: {
				type: Boolean,
				default: false
			},
			/**
			 * 对齐方式
			 */
			position: {
				type: String,
				// top - 顶部, middle - 居中, bottom - 底部
				default: 'middle'
			},
			/**
			 * 显示模式
			 */
			mode: {
				type: String,
				default: 'insert'
			},
			/**
			 * h5遮罩是否到顶
			 */
			h5Top: {
				type: Boolean,
				default: false
			},
 
 
			title: {
				type: String,
				default: '提示'
			},
			text: {
				type: String,
				default: '请输入内容'
			},
			btn_cancel: {
				type: String,
				default: '取消'
			},
			btn_certain: {
				type: String,
				default: '确定'
			},
			buttonMode: {
				type: String,
				default: 'bottom'
			}
		},
		watch: {
			h5Top(newVal) {
				if (newVal) {
					this.offsetTop = 44
				} else {
					this.offsetTop = 0
				}
			}
		},
		created() {
			let offsetTop = 0
			// #ifdef H5
			if (!this.h5Top) {
				offsetTop = 44
			} else {
				offsetTop = 0
			}
			// #endif
			this.offsetTop = offsetTop
		},
		methods: {
			maskMoveHandle() {},
 
			/*
			 * 内部私有方法建议以下划线开头
			 * triggerEvent 用于触发事件
			 */
			_cancel() {
				//触发cancel事件
				this.cost = '';
				this.$emit('onCancel');
			},
			_confirm() {
				this.$emit('onConfirm', this.cost);
				this.cost = '';
			},
			_input(e) {
				this.cost = e.detail.value;
			}
		}
	}
</script>
 
<style>
	/* components/vas-prompt/vas-prompt.wxss */
	.uni-mask {
		position: fixed;
		z-index: 998;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		background-color: rgba(0, 0, 0, 0.3);
	}
 
	.uni-prompt-middle {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
	}
 
	.uni-prompt-middle.uni-prompt-insert {
		transform: translate(-50%, -65%);
		box-shadow: none;
	}
 
	.uni-prompt-middle.uni-prompt-fixed {
		border-radius: 10upx;
		padding: 30upx;
	}
 
	.uni-close-bottom,
	.uni-close-right {
		position: absolute;
		bottom: -180upx;
		text-align: center;
		border-radius: 50%;
		color: #f5f5f5;
		font-size: 60upx;
		font-weight: bold;
		opacity: 0.8;
		z-index: -1;
	}
 
	.uni-close-bottom {
		margin: auto;
		left: 0;
		right: 0;
	}
 
	.uni-close-right {
		right: -60upx;
		top: -80upx;
	}
 
	.uni-close-bottom:after {
		content: '';
		position: absolute;
		width: 0px;
		border: 1px #f5f5f5 solid;
		top: -200upx;
		bottom: 56upx;
		left: 50%;
		transform: translate(-50%, -0%);
		opacity: 0.8;
	}
 
	.prompt-content {
		position: fixed;
		z-index: 999;
		background-color: #ffffff;
		width: 480upx;
		border-radius: 20upx;
	}
 
	.prompt-title {
		width: 100%;
		padding: 15upx 0 15upx 0;
		text-align: center;
		font-size: 32upx;
		position: relative;
	}
 
	.prompt-title::after {
		position: absolute;
		z-index: 3;
		right: 0;
		bottom: 0;
		left: 0;
		height: 1px;
		content: '';
		-webkit-transform: scaleY(.5);
		transform: scaleY(.5);
		background-color: #c8c7cc;
	}
 
	.prompt-input {
		margin: 8%;
		width: 80%;
		height: 70upx;
		border: 1px solid #ccc;
		border-radius: 10rpx;
		padding-left: 10upx;
		font-size: 28upx;
		font-weight: 100;
	}
 
	.prompt-btn-group {
		width: 100%;
		position: relative;
		height: 75upx;
	}
 
	.prompt-btn-group::before {
		position: absolute;
		z-index: 3;
		right: 0;
		top: 0;
		left: 0;
		height: 1px;
		content: '';
		-webkit-transform: scaleY(.5);
		transform: scaleY(.5);
		background-color: #c8c7cc;
	}
 
	.btn-item {
		width: 50%;
		display: inline-block;
		text-align: center;
		position: relative;
		height: 75upx;
		line-height: 75upx;
	}
 
	.prompt-cancel-btn::after {
		position: absolute;
		z-index: 3;
		right: 0;
		top: 0;
		bottom: 0;
		width: 1px;
		content: '';
		-webkit-transform: scaleX(.5);
		transform: scaleX(.5);
		background-color: #c8c7cc;
	}
 
	.dividing-line {
		width: 1upx;
		height: 100%;
		background-color: #d5d5d6;
	}
 
	.contentFontColor {
		color: #868686;
	}
 
	.uni-close-bottom,
	.uni-close-right {
		position: absolute;
		bottom: -180upx;
		text-align: center;
		border-radius: 50%;
		color: #f5f5f5;
		font-size: 60upx;
		font-weight: bold;
		opacity: 0.8;
		z-index: -1;
	}
 
	.uni-close-bottom {
		margin: auto;
		left: 0;
		right: 0;
	}
 
	.uni-close-right {
		right: -60upx;
		top: -80upx;
	}
 
	.uni-close-bottom:after {
		content: '';
		position: absolute;
		width: 0px;
		border: 1px #f5f5f5 solid;
		top: -200upx;
		bottom: 56upx;
		left: 50%;
		transform: translate(-50%, -0%);
		opacity: 0.8;
	}
</style>

组件调用

<text class="iconfont iconxinzeng" @click="prompt('uni-prompt')"></text>
<prompt :show="promptType === 'uni-prompt'" @onConfirm="onConfirm" @onCancel="prompt('')" title="请输入标题" text="请输入标题"></prompt>
 
<script>
	import prompt from '../../components/uni-prompt/uni-promot.vue'
	export default {
		components: {
			prompt
		},
		data() {
			return {
				promptType: ''
			}
		},
		methods: {
			prompt(type) {
				console.log(type)
				this.promptType = type;
			},
			onConfirm(e) {
				console.log(e);
				let _cost = e;
				if (_cost == '') {
					this.showMsg({
						title: '请输入标题!',
						position: 'bottom'
					})
					return;
				} else {
					this.prompt('')
					this.showLoading()
					uni.request({
						url: `${this.$serverUrl}/mysetting/addMySetting`,
						method: "POST",
						header: {
							"Content-Type": "application/x-www-form-urlencoded",
							'token': this.$store.state.userInfo.token
						},
						data: {
							'userId': this.$store.state.userInfo.userId,
							'title': _cost,
							'startArea': this.startArea,
							'endArea': this.endArea,
							'invoiceType': this.invoiceType,
							'invoiceTypeFlg': this.invoiceTypeFlg
						},
						success: (e) => {
							console.log(e);
							uni.hideLoading();
							this.showMsg({
								title: e.data.msg,
								position: 'bottom'
							})
						},
						fail: (e) => {
							uni.hideLoading();
							this.showMsg({
								title: "请求失败,请重试!",
								position: 'bottom'
							})
						}
					})
				}
			},
		}
	}
</script>

标签:position,Prompt,bottom,app,50%,right,prompt,Uni,uni
From: https://www.cnblogs.com/guozhiqiang/p/18138497

相关文章

  • MIT6.S081 - Lab1: Xv6 and Unix utilities
    Part1:sleep实验要求与提示可以参考user/echo.c,user/grep.c和user/rm.c文件如果用户忘记传递参数,sleep应该打印一条错误消息命令行参数传递时为字符串,可以使用atoi函数将字符串转为数字使用系统调用sleep,有关实现sleep系统调用的内核代码参考kernel/sysproc.c(......
  • uniapp踩坑:编译H5解决浏览器跨域问题
    uniapp编译到app是不存在跨域问题的,但是编译到H5就会有跨域问题。记录一下工作中遇到跨域及解决跨域方法方法一:直接编译Hbuilder内置浏览器,能解决跨域,但是内置浏览器调试没有谷歌爽方法二:在manifest.json文件中配置跨域,该方法类似vue.config.js中的devServer 步骤一"......
  • 实验一 二手交易平台APP原型设计
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求1.对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。墨刀的适用领域及优缺点适用领域墨刀是一款在线原型设计与协同工具,借助墨刀,产品经理、设计师、开发、......
  • 实验一原型设计——网抑云在线听歌APP
    1、对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。(1)墨刀(MockingBot):适用领域:墨刀适合初级到中级的原型设计者,特别适用于快速设计简单的界面原型,可用于移动应用和网页设计。优点:界面简洁,易于上手,对于不熟悉专业设计软件的用户友好。支持在线......
  • 实验一:在线听歌APP原型设计
    一、原型设计工具的各自的适用领域及优缺点墨刀:适用领域:交互设计:墨刀提供了丰富的交互组件和动画效果,能够快速创建具有交互功能的原型。移动应用原型设计:墨刀专注于移动应用的原型设计,支持各种常见移动设备的屏幕尺寸和分辨率。用户测试和反馈收集:墨刀支持在线分享原型,轻......
  • 肖sir__app实战运用
    一、打开模拟器 二、cmd中打开dos命令adb connect  127.0.0.1:62001   三、安装测试包adb install  D:\app\baiduyuedu_3760.apkE:\dcs\two\app\mojibase.apk  四、打开appium    五、( 定位元素没有xpath的就删除原有uiautomatorviewer.......
  • Unity GC
    CLR和.Net对象生存周期.NETFramework和.NETCore为开发者提供了一个强大的应用程序执行环境,称为公共语言运行时(CLR)。CLR是一个由Microsoft开发的、提供.NET应用程序运行时功能的组件。它处理了许多底层任务,包括内存管理、程序集加载、异常处理、垃圾回收以及线程同步等。CLR的目......
  • Scratch3之AI集成 - flappy bird AI版本
    AI神秘且有趣,我们一个经典的游戏flappybird集成AI,实现自训练成长的聪明的笨鸟。先上效果:初始化的笨鸟拥有分身,每个分身都有自我学习功能,根据自己的移动轨迹和得分情况进行汇总,进行新一代的笨鸟的迭代,基本经过数十轮的训练和迭代,能完成高智慧的笨鸟,自我闯关能力强。 需要了解......
  • error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
    问题"commandfailed"err="failedtorunKubelet:validateserviceconnection:validateCRIv1runtimeAPIforendpointunix:///run/containerd/containerd.sock":rpcerror:code=Unimplementeddesc=unknownserviceruntime.v1.RuntimeSe......
  • 实验一原型设计—恰饭app
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求:对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。答:1.适用领域:墨刀:墨刀是一款在线的移动应用原型与线框图工具,适合设计团队和个人用户使用,用于移动端和We......