7.从0做一个vue键盘组件

文章目录

  • 1. 从0做一个键盘组件
    • 1.1. 最终效果
    • 1.2. 分析
    • 1.3. 实现
    • 1.4. 如何引用

1. 从0做一个键盘组件

首先是why的问题:为什么需要做键盘组件?

我们目前可知的场景:

  1. 在新增账单的时候,需要用到键盘
  2. 在比如从账单列表页,进行行项目编辑某笔账单的时候,也需要用到键盘

如果都是每个vue页面自己写键盘的话,就比较尴尬了,回头需要优化的时候,就要多处维护。

所以,我们需要定义一个键盘组件。

1.1. 最终效果

或者是编辑的时候:

1.2. 分析

  1. 主要是显示:item_name账单类目名称、bill_money账单金额、账单日期选择、提交账单、删除账单
  2. 如果是新增账单,就不显示”删除账单“按钮;如果是编辑账单,展示”删除账单“按钮。

1.3. 实现

整体的键盘样式都比较简单,可以直接通过布局来绘制。

直接上代码:

<template><view class="keyboardbox"><view style="display: flex; font-size: 50rpx; justify-content: space-between; padding: 20rpx 20rpx;"><view style="font-size: 40rpx;">{{item_name}}</view><view color = '#bbb' >{{bill_money}}</view></view><u-inputplaceholder="备注: 点击填写备注":border="true"v-model="bill_desc"clearable></u-input><view class="numkeyboard"><view class="num-area"><view class="row" v-for="(item,index) in numKeybordList" :key="index"><view class="item"v-for="(ite,idx) in item" hover-class="active" :hover-start-time="0":hover-stay-time="5" :key="idx" @tap="input(ite)">{{ite}}</view></view></view><view class="btn-area"><view :class="['item','dateChoose']" hover-class="active" :hover-start-time="0" :hover-stay-time="5"@tap="dateVal"><view class="uni-input">{{choosedDateShow}}</view></view><view :class="['item','del']" hover-class="active" :hover-start-time="0" :hover-stay-time="5"@tap="deleteVal"><u-icon name="arrow-leftward"></u-icon></view><view class="confirem item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"@tap="submit">完成</view><view v-if="add_or_update=='编辑账单'" class="deletebill item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"@tap="deleteBill">删除账单</view></view></view></view><u-picker mode="time":default-time="date_picker_date" v-model="date_picker_show" :params="date_picker_params"@confirm="date_pick_ok"></u-picker><!-- <u-modal v-model="showDeleteBillModal" :content="content" negative-top=500></u-modal> -->
</template><script setup>import {ref, defineProps, defineEmits, watch, defineModel, computed} from 'vue';import {onLoad,onUnload,onReachBottom,onShareAppMessage,onShareTimeline} from "@dcloudio/uni-app"onLoad((e)=>{});const add_or_update = defineModel("add_or_update", { type: String, default: '' });const bill_id = defineModel("bill_id", { type: String, default: '' });const item_name = defineModel("item_name", { type: String, default: '' });const bill_money = defineModel("bill_money", { type: String, default: '' });const bill_desc = defineModel("bill_desc", { type: String, default: '' });const date_picker_date = defineModel("date_picker_date", {type: String, default: ''})console.log(add_or_update.value);console.log(date_picker_date.value);console.log(bill_id.value);const numKeybordList = ref([  // 键盘数值[1, 2, 3],[4, 5, 6],[7, 8, 9],[0, '.']]);// 默认不显示时间选择组件。在点击了“今天”之后,可以进行选择其他日期const date_picker_show = ref(false);// 选择时间时候的时间选择组件,仅展示年月日const date_picker_params = ref({year: true,month: true,day: true,hour: false,minute: false,second: false});// 监听contentId// watch(()=>props.item_name,(newValue, oldValue)=>{// 	console.log(newValue);//    item_name.value = newValue// },{ deep: true, immediate:true})/*** 按键* @param {Object}*/// const clickInfo = () => {const input = (val) => {// input(val) {let money = bill_money.value;if (money.length >= 10) {uni.showToast({title: '金额过大',icon: 'error'})return;}let arr = money.split('.');if (money == '0.00' && val != null) {money = val.toString();} else {let arr = money.split('.');if (val == '.' && arr.length > 1) {} else if (arr.length <= 1 || (arr.length > 1 && arr[1].length <= 1)) {if (money == '0' && val != '.') {money = val.toString();} else if (money != '0' || val != '0')money += val;}}bill_money.value = money;};/*** 删除*/const deleteVal = () => {// deleteVal() {let money = bill_money.value; console.log(money.length);if (money != '0.00' && money.length > 0)money = money.substring(0, money.length - 1)if (money.length <= 0)money = '0.00';bill_money.value = money;};const date_pick_ok = (callback_data) => {// date_pick_ok(callback_data) {date_picker_date.value = callback_data.year + '-' + callback_data.month + '-'  + callback_data.day;console.log('选择了:' + date_picker_date.value);};const dateVal = () => {date_picker_show.value = true;};const emit = defineEmits(['submit', 'deleteBill']);const submit = () => {emit('submit',{bill_money: bill_money.value,bill_desc: bill_desc.value,date_picker_date: date_picker_date.value},(res)=>{//回调函数的方法体.处理自己的业务.console.log("获取到父组件执行结果的回调");console.log(res);});};const deleteBill = () => {uni.showModal({title: '提示',content: '确定要删除此账单吗?',success: function (res) {if (res.confirm) {console.log('用户点击确定');emit('deleteBill',{bill_id: bill_id.value},(res)=>{//回调函数的方法体.处理自己的业务.console.log("获取到父组件执行结果的回调");console.log(res);});} else if (res.cancel) {console.log('用户点击取消');}}});};const getTodayDateTime = () => {var date = new Date();var Y = date.getFullYear() + '-';var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) + '-';var D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate())+ ' ';var h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours())+ ':';var m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes()) + ':';var s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds();return Y+M+D+h+m+s;};// 一个计算属性 refconst choosedDateShow = computed(() => {if (date_picker_date.value == getTodayDateTime().substring(0, 10)) {return '今天';}else {return date_picker_date.value;}})</script><style lang="scss">
.keyboardbox {width: 100%;position: absolute;left: 0;bottom: 0;background-color: #FFFFFF;.numkeyboard {height: 432rpx;display: flex;background-color: #ebedf0;.btn-area {width: 180rpx;height: 100%;display: flex;flex-direction: column;.item {width: 100%;display: flex;justify-content: center;align-items: center;flex-grow: 1;}.del {background-color: #ebedf0;color: #333;&.active {background-color: #f1f3f5;}}.confirem {background-color: #4fae70;color: #FFFFFF;&.active {background-color: #4fae70;}}.deletebill {background-color: #e94d26;color: #333;}.dateChoose {background-color: #f9db56;color: #2d2d2d;&.active {background-color: #f9db56;}}}.num-area {flex-grow: 1;display: flex;flex-wrap: wrap;.row {width: 100%;height: 25%;display: flex;margin-top: 1px;.item {flex-grow: 1;height: 100%;display: flex;justify-content: center;align-items: center;background-color: #FFFFFF;border-right: 1px solid #ebedf0;width: 33.33%;&.active {background-color: #ebedf0;}&.z {flex-grow: 2;width: 66.66%;}&.disabled {background: #FFFFFF;color: #B9B9B9;}}}}}}
</style>

1.4. 如何引用

我们选择在父组件里面,通过一个u-popup来包裹此键盘组件,并在显示之前,把要传递进去显示的数据用v-model进行绑定:

  • 如果是添加账单的场景:父组件传值给子组件;子组件要调用父组件的submit方法;子组件要知道父组件submit方法的执行结果。
<u-popup v-model="popup_show" mode="bottom" border-radius="14" height="600rpx"><keyboard-info :item_name="item_name" :bill_money="bill_money" :bill_desc="bill_desc":date_picker_date="date_picker_date":add_or_update="'添加账单'"@submit="submit"></keyboard-info></u-popup>
// 上面的item_name、bill_money、bill_desc、date_picker_date要自行处理赋值。
selectItem(index) {this.bill_money = '0.00';// 点击弹出的金额默认还原为0this.bill_desc = '';// 理由同上this.select_item = index;this.popup_show = true;  // 展示u-popup,也就能展示出来键盘子组件了。if (this.current_type == 0) {this.item_name = this.expenditure_list[index-1].textthis.item_img_path = this.expenditure_list[index-1].iconthis.item_id = this.expenditure_list[index-1].id}else {this.item_name = this.income_list[index-1].textthis.item_img_path = this.income_list[index-1].iconthis.item_id = thisincome_list[index-1].id}
},
// submit方法,主要是用来给键盘组件在点击键盘的”提交“按钮时,将键盘组件录入的数据回传到父组件的submit方法中
// 这里要再说一下callback参数,其实是键盘组件为了获取到父组件执行了submit方法之后的返回值,以便在成功执行操作之后,将键盘隐藏或引导页面跳转
submit(data, callback) {console.log('收到键盘子组件触发submit方法');console.log(data);if (this.direction == '支出') {data.bill_money = -data.bill_money;}// console.log('bill_add.vue的 submit() 方法被调用');let bill_detail = {bill_id: this.direction + this.getTodayDateTime(),direction: this.direction,year: parseInt(this.date_picker_date.substring(0, 4)),month: parseInt(this.date_picker_date.substring(5,7)),day: parseInt(this.date_picker_date.substring(8,10)),week: this.getWeek(this.date_picker_date),item_name: this.item_name,item_img_path: this.item_img_path,item_id: parseInt(this.item_id),add_time: this.getTodayDateTime(),update_time: this.getTodayDateTime(),// 下面3个,是从键盘组件回调来的值bill_desc: data.bill_desc,bill_date: data.date_picker_date,bill_money: parseFloat(data.bill_money)}console.log(bill_detail);callback(true);
},
  • 如果是编辑账单的场景

    <u-popup v-model="popup_show" mode="bottom" border-radius="14" height="600rpx"><keyboard-info :item_name="item_name" :bill_money="bill_money" :bill_desc="bill_desc":date_picker_date="date_picker_date":add_or_update="'编辑账单'":bill_id="bill_id"@submit="submit"@deleteBill="deleteBill"></keyboard-info></u-popup>
    

    跟之前的分析是类似的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保护共享资源的方法(互斥锁)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

MagicAnimate: Temporally Consistent Human Image Animation using Diffusion Model

show lab NUS&bytedancehttps://github.com/magic-research/magic-animate 问题引入 输入参考图片 I r e f I_{ref} Iref​和动作序列 p 1 : N [ p 1 , ⋯ , p N ] p^{1:N}[p_1,\cdots,p_N] p1:N[p1​,⋯,pN​]&#xff0c;其中 N N N表示的是帧数&#xff0c;输出的是 …

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…

LeetCode 79.单词搜索

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内…

6款网页表白代码6(附带源码)

6款网页表白代码6 前言效果图及部分源码1.爱心倒计时2.一起看星星3.爱心4.爱心&#xff08;有鼠标移动特效&#xff09;5.爱心&#xff08;高级效果&#xff09;6.爱心&#xff08;3D效果&#xff09; 领取源码下期更新预报 前言 大部分人都有喜欢的人&#xff0c;学会这些表白…

蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

微软Edge

微软Edge浏览器概述 功能介绍 微软Edge是一款基于Chromium开源项目的网页浏览器&#xff0c;旨在提供更快的网页加载速度、更高的安全性和更好的用户体验。它支持多种操作系统&#xff0c;包括Windows、macOS、Android和iOS&#xff0c;能够满足不同用户的需求。Edge浏览器拥…

【Linux】-Zookeeper安装部署[17]

简介 apache ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和H…

2024最新 Jenkins + Docker 实战教程(四) - 编写自己的Springboot项目实现自动化部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

0407放大电路的频率响应

放大电路的频率响应 单时间常数RC电路的频率响应中频响应高频响应低频响应全频域响应 放大电路频率响应概述1. 直接耦合放大电路频域响应阻容耦合放大电路频域响应 4.7.1 单时间常数RC电路的频率响应 4.7.2 放大电路频率响应概述 4.7.3 单级共射极放大电路的频率响应 4.7.4 单级…

TOSHIBA UTLH21 属于Unifi NV系列

TOSHIBA UTLH21 是东芝推出的一款工业控制器&#xff0c;属于Unifi NV系列。 这款控制器代表了东芝在工业自动化领域的一次重要进步&#xff0c;它在功能和性能上都超越了现有的V系列控制器。以下是UTLH21的一些主要特点&#xff1a; 高速逻辑与控制能力&#xff1a;UTLH21具…

Spring框架中获取方法参数名称:DefaultParameterNameDiscoverer

DefaultParameterNameDiscoverer 是Spring框架中用于获取方法参数名称的一个类。在Java中&#xff0c;方法的参数名称通常在编译时会丢失&#xff0c;因为Java字节码并不强制要求保留这些信息。Spring提供了一种机制来恢复这些参数名称&#xff0c;这就是通过DefaultParameterN…

IT行业的现状与未来趋势

这里写目录标题 一、引言二、IT行业的现状三、IT行业面临的挑战四、IT行业的未来趋势五、结论 一、引言 信息技术&#xff08;IT&#xff09;行业在过去几十年中经历了飞速发展&#xff0c;从早期的计算机硬件和软件开发&#xff0c;到如今涵盖云计算、人工智能、大数据、物联…

深度学习之基于Django+Tensorflow卷积神经网络实时口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着全球疫情的持续&#xff0c;佩戴口罩成为了公众日常生活中不可或缺的一部分。特别是在人员密集的…

【python】python社交交友平台系统设计与实现(源码+数据库)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

BEVFuison测试全过程记录

cuda版本10.1 pytorch&#xff1a; 根据cuda版本选择pytorch版本&#xff1a; 1. 创建conda虚拟环境&#xff1a; conda create -y --name mmcv python3.8 conda activate mmcv2. 安装依赖库&#xff1a; pytorch: conda install pytorch1.7.1 torchvision0.8.2 torchaudi…

特征融合篇 | YOLOv8改进之引入轻量级跨尺度特征融合模块CCFM | 源自RT-DETR

前言:Hello大家好,我是小哥谈。CCFM(Cross-Scale Feature Fusion Module)即为跨尺度特征融合模块。这个模块的作用是将不同尺度的特征通过融合操作整合起来,以增强模型对于尺度变化的适应性和对小尺度对象的检测能力。CCFM可以有效地整合细节特征和上下文信息,从而提高模…

2024定制版抢单支付系统源码(开代理自动抢单接单)

随着网络和移动支付技术的不断进步&#xff0c;抢单支付系统已经成为商家和用户进行交易的便利工具。2024定制版抢单支付系统源码为开发者提供了一个可定制化的解决方案&#xff0c;具备开放代理和自动抢单接单功能&#xff0c;帮助用户快速搭建抢单支付平台。本文将为您介绍这…

专题汇编 | ChatGPT引领AIGC新浪潮(一)

ChatGPT的产生与迭代 2022年11月末,美国人工智能研究实验室OpenAI推出ChatGPT。上线的ChatGPT只用了2个月,活跃用户数就突破了1亿,创造了应用增速最快的纪录。 ChatGPT是什么 ChatGPT是一种人工智能技术驱动的自然语言处理(Natural Language Processing,NLP)工具,使用的…

RS8751XF功能和参数介绍及PDF资料

以下是关于RS8751XF的功能和参数的介绍&#xff1a; 功能描述: 高速、宽带单通道运算放大器 轨到轨输入和输出&#xff0c;确保较大的动态范围 极高的增益带宽乘积&#xff08;GBW&#xff09;&#xff1a;250 MHz&#xff0c;适合高频应用 极高的压摆率&#xff08;SR&#xf…