「HarmonyOS」验证码多TextInput输入框焦点自动跳转问题

需求背景:需要做一个多输入框的验证码模块,输入验证码时输入后光标会自动跳转至下一个输入框,删除验证码时会自动删除上一个输入框内容,并且光标跳转至上一个输入框内。6位验证码全部输完后进行登录请求

具体样式如下图:

在这里插入图片描述

具体实现效果如下图:

在这里插入图片描述

思路分析:

1.组件化

这个验证码输入框每个都样式和交互逻辑都非常相似,将其提取出作为组件化编写,减少代码冗余,先将单个输入框的样式进行编写

@Component
struct codeInputView {code: stringkeyNo: numberkeyStr: stringbuild() {Row() {Column() {TextInput({text: this.code}).backgroundColor($r('app.color.smart_F5F5F5')).maxLength(1).type(InputType.Number).align(Alignment.Center).width((screenWidthPxToVp - 87)/6 - 10)}.width((screenWidthPxToVp - 87)/6)}.height(55).backgroundColor($r('app.color.smart_F5F5F5')).borderRadius(8)}
}
2.实现输入的时候,输入后光标跳转至下一个输入框

通过查阅开发文档和相关资料,发现可以将focusControl和key配合使用进行切换聚焦组件,切换焦点

相关资料链接

// 自定义输入框组件
@Component
struct codeInputView {@State code:stringkeyNo: numberkeyStr: string// 将code值传递到外部transfer: (number) => void// 登录请求回调requestAction?: ()=>voidbuild() {Row() {Column() {TextInput({text: this.code}).backgroundColor($r('app.color.smart_F5F5F5')).maxLength(1).type(InputType.Number).align(Alignment.Center).width((screenWidthPxToVp - 87)/6 - 10).onChange((value) => {if (value.length == 1) {// 当输入框中有验证码输入// 当不是最后一个输入框时,焦点跳转到下一个输入框if (this.keyNo != 5) {// 验证码赋值this.code = value// 验证码传递至外部this.transfer(value)// 切换焦点到下一个输入框let nextKeyNo: number = this.keyNo + 1let nextKeyStr = 'code' + nextKeyNoLog.info('nextKeyStr = ' + nextKeyStr)focusControl.requestFocus(nextKeyStr)} else {// 当最后一个输入框时,传值并且进行登录请求回调this.transfer(value)this.requestAction()}}}).onFocus(() => {// 获取焦点时进行日志打印查看Log.info('get focus = ' + this.keyStr)})// 设置输入框key值.key(this.keyStr)}.width((screenWidthPxToVp - 87)/6)}.height(55).backgroundColor($r('app.color.smart_F5F5F5')).borderRadius(8)}
}// 页面代码
@Entry
@Component
export default struct VerifyLoginPage {private inputVerify: string = '请输入验证码'private hadSentToPhone: string = '已发送验证码到您的手机号'private code0: stringprivate code1: stringprivate code2: stringprivate code3: stringprivate code4: stringprivate code5: string@State phone: string = ''onPageShow() {this.phone = router.getParams()?.['phone']}build() {Flex({direction: FlexDirection.Column, alignItems: ItemAlign.Start}) {Image($r('app.media.back_icon')).size({width: 33, height: 33}).onClick(() => {Log.info('click back button')router.back()})Text(this.inputVerify).textStyle(25, $r('app.color.smart_24292B'), FontWeight.Medium).margin({top: 32})Text(this.hadSentToPhone + this.phone).textStyle(14, $r('app.color.smart_9DA2A5'), FontWeight.Regular).margin({top: 12})// 验证码输入框Flex({direction: FlexDirection.Row, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween}) {codeInputView({keyNo: 0, keyStr: 'code0', transfer: (num)=>{this.code0 = num}})codeInputView({keyNo: 1, keyStr: 'code1', transfer: (num)=>{this.code1 = num}}).margin({left: 11})codeInputView({keyNo: 2, keyStr: 'code2', transfer: (num)=>{this.code2 = num}}).margin({left: 11})codeInputView({keyNo: 3, keyStr: 'code3', transfer: (num)=>{this.code3 = num}}).margin({left: 11})codeInputView({keyNo: 4, keyStr: 'code4', transfer: (num)=>{this.code4 = num}}).margin({left: 11})codeInputView({keyNo: 5, keyStr: 'code5', transfer: (num)=>{this.code5 = num}, requestAction: ()=>{this.loginRequest()}}).margin({left: 11})}.margin({top: 80})}.width('100%').padding({left: 16, right: 16})}// 登录请求
loginRequest() {let code = this.code0 + this.code1 + this.code2 + this.code3 + this.code4 + this.code5Log.info('phone = ' + this.phone)Log.info('code = ' + code)// 登录网络请求// xxxxxxx
}

此时,可以实现当输入后,光标可以跳转至下一个输入框中,并且可以将输入的code传递至组件外部进行存储在页面中

3.实现删除时,删除前一个输入框内容,并且光标跳转至前一个输入框中

通过日志打印发现,输入删除按钮,onChange方法无法获取到删除的value值。于是通过查看开发文档,发现可以通过onKeyEvent(event: KeyEvent) => {}方法,获取到删除指令,并且通过打印日志发现,每次点击删除按键,都会执行两次删除方法。

这在一开始非常奇怪和难受,因为我想用同样key的值递减来控制光标的移动,而每次删除时,都会往前跳两个输入框,并且输入框的内容不会删除,所以由此我想到可以一次删除方法来进行光标跳转,一次删除方法用来删除输入框的内容。

以下为更新后最终代码

@Component
struct codeInputView {@State code: string = ''keyNo: numberkeyStr: stringtransfer: (number) => voidrequestAction?: ()=>voidbuild() {Row() {Column() {TextInput({text: this.code}).backgroundColor($r('app.color.smart_F5F5F5')).maxLength(1).type(InputType.Number).align(Alignment.Center).width((screenWidthPxToVp - 87)/6 - 10).onChange((value) => {if (value.length == 1) {if (this.keyNo != 5) {let nextKeyNo: number = this.keyNo + 1let nextKeyStr = 'code' + nextKeyNoLog.info('nextKeyStr = ' + nextKeyStr)this.code = valuethis.transfer(value)focusControl.requestFocus(nextKeyStr)} else {this.transfer(value)this.requestAction()}}}).onFocus(() => {Log.info('get focus = ' + this.keyStr)Log.info('thisCode = ' + this.code)})// 删除验证码时执行的方法回调.onKeyEvent((event: KeyEvent) => {if (event.keyCode == KeyCode.KEYCODE_DEL) {// 当code值不为空时,删除code值if (this.code != '') {this.code = ''} else if (this.keyNo > 0) {// 如果不是第一个输入框,则每次递减keyNo使光标进行跳转至前一个输入框内let preKeyNo: number = this.keyNo - 1let preKeyStr = 'code' + preKeyNoLog.info('preKeyStr = ' + preKeyStr)focusControl.requestFocus(preKeyStr)}}}).key(this.keyStr)}.width((screenWidthPxToVp - 87)/6)}.height(55).backgroundColor($r('app.color.smart_F5F5F5')).borderRadius(8)}
}// 页面代码
// 页面代码与第2点相同,在此不过多赘述

此次在codeInputView组件的初始化中code值有进行修改,添加了’'空字符串,这是因为通过打印日志发现,如果不进行赋值的初始化时,code值会为undefined,这个在删除code值时会非常奇怪,所以进行了设空字符串进行初始化

最终即可实现需求所要求的交互逻辑

当前HarmonyOs仍在初步学习过程中,大家如果感兴趣或者有问题可以一起沟通交流,目前在学习过程中也遇到一些HarmonyOs开发组件上的一些小bug,希望华为可以及时进行更新修复!努力并大步的发展我们国家自己的移动端系统,遥遥领先!

如果该文章对你有所帮助的话,可以点赞、收藏并关注一下!后续会持续更新更多技术内容

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

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

相关文章

快速跳闸中间继电器 RXMS1-RK216 066-AD 24V 柜内安装,板后接线带中座

系列型号 RXMS1 RK 216 437快速跳闸继电器;RXMS1 RK 216 237快速跳闸继电器; RXMS1 RK 216 449快速跳闸继电器;RXMS1 RK 216 249快速跳闸继电器; RXMS1 RK 216 450快速跳闸继电器;RXMS1 RK 216 250快速跳闸继电器&…

three.js Raycaster(鼠标点击选中模型)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

URLConnection()和openStream()两个方法产生SSRF的原理和修复方法

今年是自主研发的第三个年份&#xff0c;也是重视安全的年份。 转一篇小文章&#xff1a; 0x00 前言 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容&#xff0c;加载指定地址的图…

VR云游开启智慧旅游新纪元,打造“云旅游”新模式

元旦假期&#xff0c;全国文化和旅游市场平稳有序&#xff0c;家人和亲友的出游趋势稳步增加&#xff0c;演唱会、音乐节、跨年等活动的叠加让元旦出游更加吸引游客。在冰雪旅游热度持续攀升的时候&#xff0c;许多年轻群体已经开始使用VR云游进行智慧景区旅游&#xff0c;身临…

项目代码生成心得

1、如果一直ctrl B 生成不了代码&#xff0c;可能是卡住了&#xff0c;要run一下才行 2、sub chart里面千万不要加上内部自转移和en,du:不然里面的内容压根不会生成代码&#xff0c;Matlab认为它可以自己在里面自己转。 3、生成的代码跟设计图是不一样的&#xff01;&#xff…

Databend 的算力可扩展性

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09; 澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer PsiACE (Chojan Shang) GitHub 对于大规模分布式数据处理系统&#xff0c;为了更好应对数据、流量、和复杂性的增长…

CRYPTO现代密码学学习

CRYPTO现代密码学学习 RC4 加密算法RSA加密解密DES加密解密详解密钥的生成密文的生成 RC4 加密算法 简单介绍&#xff1a;RC4加密算法是一种对称加密算法&#xff0c;加密和解密使用同一个函数 初始化分为以下几个步骤 初始化存储0-255字节的Sbox(其实就是一个数组)填充key到…

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入&#xff1a;关键字文件&#xff0c;每一行数据为一爬取单元。若一行存在多个and关系的关键字 &#xff0c;则用|隔开处理&#xff1a;爬取访问6个网站的推送&#xff0c;获取推送内容的标题&#xff0c;发布时间&#xff0c;来源&#xff0c;正文第一段&#xff0…

excel中找出重复项,并标红

一、查找重复值 二、清除格式 还是通过添加规则的路径&#xff0c;清除格式&#xff0c;直接通过格式刷&#xff0c;刷不掉。

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题&#xff0c;换了盘重装了系统&#xff0c;项目的数据库全部没了&#xff0c;还好之前的Mysql是安装在的D盘里&#xff0c;还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

基于SSM实现的社区论坛系统(附PPT、设计文档)

基于SSM实现的社区论坛系统&#xff08;附PPT、设计文档&#xff09; 文章目录 基于SSM实现的社区论坛系统&#xff08;附PPT、设计文档&#xff09;系统介绍技术选型成果展示设计文档用户端管理员端 源码获取账号地址及其他说明 系统介绍 基于SSM实现的社区论坛系统是一款前后…

pycharm远程开发调试(remote development)踩坑记录2

在一次我清理了服务器上一些老的pycharm版本之后 打算重新装3.2版本&#xff0c;就全部给清理了。结果坏了事了&#xff0c;新版的装不上了。 试了公司和中科院的服务器都出现这样的问题&#xff0c;100%复现。md。 一直在这一步循环&#xff1a; Downloading the IDE Backen…

echarts实现控制图(设置阈值上下限超出变色)

echarts实现控制图组件&#xff0c;拓展超出阈值变色显示&#xff0c;图中标记平均值及最大值和最小值 代码如下&#xff1a; <template><div :class"className" :style"{height:height,width:width}" /> </template><script>im…

基于Kettle开发的web版数据集成开源工具(data-integration)-介绍篇

目录 &#x1f4da;第一章 官网介绍&#x1f4d7;目标实现&#xff1a;让kettle使用更简单&#x1f4d7;架构及组成 &#x1f4da;第二章 核心功能&#x1f4da;第三章 对比Kettle&#x1f4d7;工具栏位比对&#x1f4d7;工具栏组件内容比对&#x1f4d7;扩展&#xff1a;WebSp…

多线程基础入门【Linux之旅】——下篇【死锁,条件变量,生产消费者模型,信号量】

目录 一&#xff0c;死锁 1. 死锁的必要条件 2&#xff0c;避免死锁 二&#xff0c;条件变量 同步概念与竞态条件 条件变量——初始化 静态初始化 动态初始化 pthread_cond_destroy (销毁) pthread_cond_wait (等待条件满足) pthread_cond_signal (唤醒线程) ph…

在Go语言中处理HTTPS请求

随着互联网的发展&#xff0c;安全性变得越来越重要。HTTPS作为安全的HTTP协议&#xff0c;已经被广泛使用。在Go语言中&#xff0c;处理HTTPS请求需要一些特定的步骤。本文将详细介绍如何在Go语言中处理HTTPS请求。 首先&#xff0c;确保你已经安装了Go语言的开发环境&#x…

10+免费图片素材/壁纸网站,搭一些图片处理工具,快收藏!

划到最后“阅读原文”——领取工具包&#xff08;超过1000工具&#xff0c;免费素材网站分享和行业报告&#xff09; Hi&#xff0c;我是胡猛夫~&#xff0c;专注于分享各类价值网站、高效工具&#xff01; 更多资源&#xff0c;更多内容&#xff0c;欢迎交流&#xff01;公 号…

threejs在透视相机模式下,绘制像素大小固定的元素

要求&#xff1a;在透视相机模式下绘制一个图标&#xff0c;图标大小始终为32*32px。图标如下&#xff1a; 实现思路&#xff1a; 使用THREE.Sprite。因为 SpriteMaterial 支持配置 sizeAttenuation 使Sprite大小不随相机的深度而衰减。所以我们只要保证sprite的初始的大小合适…

SpringCloud之Eureka组件工作原理详解

Eureka是一种服务注册与发现组件&#xff0c;最初由Netflix开发并开源出来。它主要用于构建分布式系统中的微服务架构&#xff0c;并提供了服务注册、服务发现、负载均衡等功能。在本文中&#xff0c;我们将详细解释Eureka的工作原理。 一、Eureka概述 Eureka是Netflix开源的一…

SAFe大规模敏捷企业级实训

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架&#xff0c;也是成长最快、最被认可、最有价值的规模化敏捷框架&#xff0c;目前全球SAFe认证专业人士已达80万人&#xff0c;福布斯100强的70%都在实施SAFe。本课程是一个2天的 SAFe权威培训课…