uni-app 自定义支付密码键盘

news/2024/7/8 15:32:09 标签: uni-app, 计算机外设, javascript

在这里插入图片描述
1.新建组件 payKeyboard .vue

javascript"><template>
	<view class="page-total" v-show="isShow">
		<view class="key-list">
			<view class="list" v-for="(item,index) in keyList" 
			:class="{'special':item.keyCode==190||item.keyCode==8,'payMoney':item.keyCode==88}"
			@click="onKeyList(item,index)"
			:key="item.keyCode">
				<text>{{item.key}}</text>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				isShow: false,
				keyList: [
					{
						key: 1,
						en: '',
						keyCode: 49,
					},{
						key: 2,
						en: 'ABC',
						keyCode: 50,
					},{
						key: 3,
						en: 'ABC',
						keyCode: 51,
					},{
						key: 4,
						en: 'ABC',
						keyCode: 52,
					},{
						key: 5,
						en: 'ABC',
						keyCode: 53,
					},
					
					{
						key: 6,
						en: 'ABC',
						keyCode: 54,
					},{
						key: 7,
						en: 'ABC',
						keyCode: 55,
					},{
						key: 8,
						en: 'ABC',
						keyCode: 56,
					},
					{
						key: '删除',
						en: 'Del',
						keyCode: 8,
					},
					{
						key: 9,
						en: 'ABC',
						keyCode: 57,
					},{
						key: 0,
						en: 'ABC',
						keyCode: 48,
					},{
						key: '确定',
						en: 'Pay',
						keyCode: 88,
					},
				],
				keyIndex: -1,
			};
		},
		props:{
			passwrdType: {
				type: String,
				default: 'pay'
			}
		},
		methods:{
			show(){
				this.isShow = true;
			},
			hide(){
				this.isShow = false;
			},
			/**
			 * 密码键盘按下
			 * @param {Object} item
			 * @param {Number} index
			 */
			onKeyList(item,index){
				let KeyInfo = item;	
				// 删除键
				if(KeyInfo.keyCode === 8 && this.keyIndex > -1){
					this.keyIndex--;
				}
				// 不是删除键
				if(KeyInfo.keyCode != 8){
					if(this.passwrdType == 'pay' && this.keyIndex >= 5){
						console.log('键盘');
						this.keyIndex = -1;
						return;
					}else{
						this.keyIndex = -1;
					}
					this.keyIndex++;
				}
				KeyInfo.index = this.keyIndex;
				this.$emit('KeyInfo',KeyInfo);
			}
		}
	}
</script>

<style scoped lang="scss">
	.page-total{
	position: fixed;
	left: 0;
	bottom: 0;
	width: 100%;
	z-index:99999;
	background-color: #f6f6f6;
}

.key-list{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	padding: 1% 3%;
	height: 90%;
	margin-top: 20rpx;
	.list{
		display: flex;
		align-items: center;
		justify-content: center;
		width: 32%;
		height: 92rpx;
		background-color: #FFFFFF;
		border-radius: 10rpx;
		box-shadow: 0 0 10rpx rgba(0,0,0,0.1);
		margin-right: 1.7%;
		margin-bottom: 16rpx;
		text{
			font-size: 38rpx;
			font-weight: bold;
			color: #222222;
		}
	}
	.list:nth-child(3n){
		margin-right: 0;
	}
	.special{
		background-color: #f6f6f6;
		box-shadow: none;
		text{
			color: #959595;
		}
	}
	.payMoney{
		background:#F4CA11;
		text{
			color: #fff;
		}
	}
}
</style>

2.引用

javascript">



<view cclass="page">
<view class="pay-title">
<text v-show="AffirmStatus === 1">请设置6位支付密码</text>
<text v-show="AffirmStatus >= 2">请确认6位支付密码</text>
</view>
<view class="pay-password" @click="onPayUp" >
			<view class="list">
				<text v-show="passwordArr.length >= 1"></text>
			</view>
			<view class="list">
				<text v-show="passwordArr.length >= 2"></text>
			</view>
			<view class="list">
				<text v-show="passwordArr.length >= 3"></text>
			</view>
			<view class="list">
				<text v-show="passwordArr.length >= 4"></text>
			</view>
			<view class="list">
				<text v-show="passwordArr.length >= 5"></text>
			</view>
			<view class="list">
				<text v-show="passwordArr.length >= 6"></text>
			</view>
		</view>
	</view>
	<PayKeyboard ref="codeKeyboard" passwrdType="pay" @KeyInfo="KeyInfo"></PayKeyboard >
</view>


import PayKeyboard  from "@/components/payKeyboard.vue"


const codeKeyboard = ref(null)
	const passwordArr = ref([])
	const newPasswordArr = ref("")
	const AffirmStatus = ref("")
	const passwordArr = ref([])
//支付密码
	function onPayUp() {
		codeKeyboard.value.show();
	}
	/**
	 * 支付键盘回调
	 * @param {Object} val
	 */
	function KeyInfo(val) {
		if (val.index >= 6) {
			return;
		}
		// 判断是否输入的是删除键
		if (val.keyCode === 8) {
			// 删除最后一位
			passwordArr.value.splice(val.index + 1, 1)
		}
		// 判断是否输入的是.
		else if (val.keyCode == 190) {
			// 输入.无效
		} else {
			if(passwordArr.value.length<=6){
				passwordArr.value.push(val.key);
			}
		}
		if (val.keyCode == 88) {
			let pass = parseInt(passwordArr.value.join(""));
			console.log(pass)
			//点击确定的接口
			/*payPassword({
				a: pass
			}).then(res => {
				if (res.code == 200) {
				}
			})*/
		}
		// 判断是否等于6
		if (this.passwordArr.length === 6) {
			if (AffirmStatus.value === 1) {
	
				setTimeout(() => {
					passwordArr.value = [];
					AffirmStatus.value = AffirmStatus.value + 1;
					codeKeyboard..value.hide()
				}, 500)
			}
		}
		// 判断到哪一步了
		if (AffirmStatus.value === 1) {
			oldPasswordArr.value = parseInt(passwordArr.value.join(""));
		} else if (AffirmStatus.value >= 2) {
			afPasswordArr.value = parseInt(passwordArr.value.join(""));
			if (this.passwordArr.length === 6) {
			}
		}
		
		this.$forceUpdate();
	}

<style scoped lang="scss">
	.page {
		/* #ifdef H5 */
		margin-top: 44px;
		/* #endif */
		/* #ifdef APP-PLUS */
		margin-top: calc(44px + var(--status-bar-height));
		/* #endif */
		background: #fff;
	}

	.pay-title {
		display: flex;
		align-items: center;
		justify-content: center;
		width: 100%;
		height: 200rpx;

		text {
			font-size: 28rpx;
			color: #555555;
		}
	}

	.pay-password {
		display: flex;
		align-items: center;
		width: 90%;
		height: 80rpx;
		margin: 20rpx auto;
		border: 2rpx solid #999;

		.list {
			display: flex;
			align-items: center;
			justify-content: center;
			width: 16.666%;
			height: 100%;
			border-right: 2rpx solid #999;

			text {
				font-size: 32rpx;
			}
		}

		.list:nth-child(6) {
			border-right: none;
		}
	}
</style 

http://www.niftyadmin.cn/n/5537334.html

相关文章

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述&#xff1a; 这题和曾经做过的LeetCode203.移除元素一模一样&#xff0c;所以我们就使用LeetCode进行书写&#xff0c;题目链接203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

Python pyecharts 模块

pyecharts 是一个基于 ECharts.js 的 Python 可视化库&#xff0c;用于生成各种类型的交互式图表和数据可视化。它支持多种常见的图表类型&#xff0c;如折线图、柱状图、散点图、饼图等&#xff0c;可以在 Web 页面中呈现&#xff0c;并且具有丰富的配置选项和样式定制能力。 …

以太网协议介绍——UDP

注&#xff1a;需要先了解一些以太网的背景知识&#xff0c;方便更好理解UDP协议、 以太网基础知识一 以太网基础知识二 UDP协议 UDP即用户数据报协议&#xff0c;是一种面向无连接的传输层协议&#xff0c;属于 TCP/IP 协议簇的一种。UDP具有消耗资源少、通信效率高等优点&a…

昇思25天学习打卡营第16天 | DCGAN生成漫画头像

这两天把minspore配置到我的电脑上了&#xff0c;然后运行就没什么问题了✨&#x1f60a; 今天学这个DCGAN生成漫画头像&#xff0c;我超级感兴趣的嘞&#x1f984;&#x1f970; GAN基础原理 这部分原理介绍参考GAN图像生成。 DCGAN原理 DCGAN&#xff08;深度卷积对抗生成…

一个开源的、独立的、可自托管的评论系统,专为现代Web平台设计

大家好&#xff0c;今天给大家分享的是一个开源的、独立的、可自托管的评论系统&#xff0c;专为现代Web平台设计。 Remark42是一个自托管的、轻量级的、简单的&#xff08;但功能强大的&#xff09;评论引擎&#xff0c;它不会监视用户。它可以嵌入到博客、文章或任何其他读者…

nuxt3搭建和部署

Nuxt 3是一个基于Vue 3的静态网站生成框架&#xff0c;它提供了高性能、SEO友好的Web应用程序开发体验。Nuxt 3重写了许多核心代码&#xff0c;增加了新功能&#xff0c;如基于Vite的构建系统、改进的路由系统、数据获取和插件系统。它支持TypeScript和多种渲染模式&#xff08…

海量设备集中运维,向日葵远程控制赋能农牧产品加工产业链

产业规模越大&#xff0c;单位成本就越低&#xff0c;这是一个广泛存在的商业规律。 在诸多行业中&#xff0c;农牧业的这种“规模效应”尤为明显&#xff0c;这使得在农牧行业内逐渐发展出许多横跨产业链上下游的大型企业集团&#xff0c;业务甚至覆盖相关产业设备的设计与生…

js使用websocket,vue使用websocket,copy即用

新建一个文件 websocket.js // 定义websocket 地址 let socketurlDev "ws://192.000.0.0:8085/websocket/admin/"; //开发环境 let socketurlProd "wss://123456789.cn/prod-api/websocket/admin/"; //正式环境// 重连锁, 防止过多重连 let reconnectLo…