Uniapp踩坑input自动获取焦点ref动态获取实例不可用
前言
大家好我是没钱的君子下流坯,用自己的话解释自己的知识。很久很更新了,这几个月一直在加班,今天记录一个uniapp关于input中focus()方法自动获取焦点的坑。
案例
为了实现一个手机验证码的页面,验证码是五个输入框,输入第一个输入框后焦点自动获取到下一个输入框的焦点如图所示:
实现思路
我的思路是给每个输入框动态绑定一个ref实例去调用实例上的focus()方法,我第一次的代码也是这样写的代码如下所示:
<template><view class="container"><view class="otp-container"><inputv-for="(item, index) in otpLength":key="index"type="tel"maxlength="1"@input="onInput($event, index)"@focus="onFocus(index)":ref="`input-${index}`"class="otp-input"/></view><button @click="submitOTP">提交</button></view>
</template><script>
export default {data() {return {otpLength: 5, // 验证码的长度otpValues: ['', '', '', '', ''], // 存储每个输入框的值activeIndex: null // 当前聚焦的输入框索引};},methods: {onInput(event, index) {const value = event.target.value;this.$set(this.otpValues, index, value); // 更新对应输入框的值if (value && index < this.otpLength - 1) {this.$nextTick(() => {this.focusNextInput(index + 1); // 自动跳转到下一个输入框});}},onFocus(index) {this.activeIndex = index; // 记录当前聚焦的输入框索引},focusNextInput(index) {console.log(`Trying to focus input-${index}`);console.log('this.$refs:', this.$refs);const ref = this.$refs[`input-${index}`];if (ref && Array.isArray(ref) && ref.length > 0) {ref[0].focus(); // 确保引用存在再调用 focus 方法} else {console.error(`Reference for input-${index} not found or invalid`, ref);}},submitOTP() {const otp = this.otpValues.join(''); // 将所有输入框的值拼接成一个字符串console.log('提交的验证码:', otp); // 打印验证码// 这里可以添加提交验证码的逻辑}}
};
</script>
尝试方法1加判断排除DOM渲染
但是一直报错说 "TypeError: this.$refs["input-".concat(...)][0].focus is not a function" 我心想这怎么可能不是个函数难道未定义,我就抓紧打印ref发现是有这个实例的,当时就没多想又对代码进行了检查然后加了判断,考虑可能是没获取到实例或者dom没渲染出来,因为前面的input是通过v-for循环的所以进行了更全面的判断代码如下所示
focusNextInput(index) {console.log(`Trying to focus input-${index}`);const ref = this.$refs[`input-${index}`];this.$nextTick(() => {// 检查 ref 是否存在if (Array.isArray(ref) && ref.length > 0 && ref[0].focus) {ref[0].focus(); // 如果是数组形式,使用 ref[0] 并调用 focus} else if (ref && ref.focus) {ref.focus(); // 如果直接是 DOM 元素也调用 focus} else {console.error(`Reference for input-${index} not found or invalid`, ref);}});},
尝试方法2查看ref实例用ref上的方法
发现报错还是"TypeError: this.$refs["input-".concat(...)][0].focus is not a function"我就懵逼了。发现不是代码的问题,问题肯定是出现在了ref实例上,我就仔细的看ref实例里面的所有方法如下图所示

发现里没有focus()我想这一次可算找到根本了一次解决直接换成_focus()方法,发现是不报错了但是效果没有,我又换成_onFocus()方法发现也是不报错但是效果没有。到此时为止没有任何思路。
尝试方法3通过uniapp自带获取dom节点
中午吃了饭以后,我想为什么在uniapp中ref实例里面的方法不能用,那我通过uniapp自带的获取dom节点然后通过dom再去控制焦点,说干就干代码如下
focusNextInput(index) {console.log(`Trying to focus input-${index}`);const ref = this.$refs[`input-${index}`];if (ref && ref.length > 0) {// 使用微信小程序的API来设置焦点console.log(reg,'sssssssssssss')this.$nextTick(() => {uni.createSelectorQuery().in(this).select(`#input-${index}`).fields({ node: true }).exec((res) => {res[0].node._onFocus(); // 使用 focus 方法设置焦点});});} else {console.error(`Reference for input-${index} not found or invalid`, ref);}},
我把这段代码修改后发现使用focus()还不行_focus()方法_onFocus()方法也不行
解决办法
上面我是所能用的方法都用了,这时候我想着看看官网吧,发现uniapp有自带的获取焦点的方法,只有用官网的方法才可以也就是<input :focus="focusState" @blur="dataExamine()"></input>这种,我心想那直接控制:focus实现代码如下所示:
<template><view class="container"><view class="otp-container"><inputv-for="(item, index) in otpLength":key="index"type="tel"v-model="otpValues[index]":focus="activeIndex === index"maxlength="1"@input="onInput($event, index)"@focus="onFocus(index)":ref="`input-${index}`":id="`input-${index}`"class="otp-input"/></view><button @click="submitOTP">提交</button></view>
</template><script>
export default {data() {return {otpLength: 5, // 验证码的长度otpValues: ['', '', '', '', ''], // 存储每个输入框的值activeIndex: null // 当前聚焦的输入框索引};},mounted() {// 页面加载完成时绑定 refsthis.$nextTick(() => {console.log('Initial refs:', this.$refs);});},methods: {onInput(event, index) {const value = event.target.value;console.log(event, index, value,'1111111111111111111111111');this.$set(this.otpValues, index, value); // 更新对应输入框的值if (value && index < this.otpLength - 1) {this.$nextTick(() => {this.focusNextInput(index + 1); // 自动跳转到下一个输入框});}},onFocus(index) {this.activeIndex = index; // 记录当前聚焦的输入框索引console.log(this.activeIndex);},focusNextInput(index) {console.log(`Trying to focus input-${index}`);this.activeIndex = index; // 设置指定输入框为焦点},submitOTP() {const otp = this.otpValues.join(''); // 将所有输入框的值拼接成一个字符串console.log('提交的验证码:', otp); // 打印验证码// 这里可以添加提交验证码的逻辑}}
};
</script>
到此这个效果算是完成了,uniapp中有很多细节和vue上有偏差,还是需要熟读文档。还是那句话代码代码千千万,适合自己最重要。
相关文章:
Uniapp踩坑input自动获取焦点ref动态获取实例不可用
前言 大家好我是没钱的君子下流坯,用自己的话解释自己的知识。很久很更新了,这几个月一直在加班,今天记录一个uniapp关于input中focus()方法自动获取焦点的坑。 案例 为了实现一个手机验证码的页面,验证码是五个输入框…...
数据分析-47-时间序列变点检测之离线历史数据的CPD
文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 离线数据变点检测3.1 Ruptures模块3.2 恒定方差CPD3.3 变化方差CPD4…...
加入GitHub Spark需要申请
目录 加入GitHub Spark需要申请 GitHub Spark 一、产品定位与特点 二、核心组件与功能 三、支持的AI模型 四、应用场景与示例 五、未来展望 六、申请体验 加入GitHub Spark需要申请 GitHub Spark 是微软旗下GitHub在2024年10月30日的GitHub Universe大会上推出的一款革…...
生成式GPT商品推荐:精准满足用户需求
生成式GPT商品推荐:精准满足用户需求 随着人工智能(AI)技术的飞速发展,电商平台正在逐步迎来一场前所未有的变革。尤其是生成式GPT(Generative Pre-trained Transformer)技术的应用,正在重新定…...
async 和 await的使用
一、需求 点击按钮处理重复提交,想要通过disabled的方式实现。 但是点击按钮调用的方法里有ajax、跳转、弹窗等一系列逻辑操作,需要等方法里流程都走完,再把disabled设为false,这样下次点击按钮时就可以继续走方法里的ajax等操作…...
Spring Cloud Vault快速入门Demo
1.什么是Spring Cloud Vault? Spring Cloud Vault 是 Spring Cloud 生态系统中的一个项目,旨在简化 Spring 应用程序与 HashiCorp Vault 的集成。它提供了一种方便的方式来管理和访问应用程序的敏感配置数据,如数据库凭证、API 密钥和其他机…...
道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会
11月12日,2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办,电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合,满足高…...
GitHub Org
运营一个GitHub Org(组织)是一个复杂但充满价值的过程,它涉及多个方面,包括项目管理、团队协作、代码审查、文档维护、社区建设等。以下是一篇关于如何运营GitHub Org的详细指南,旨在帮助组织者更好地管理和维护其GitH…...
unity小:shaderGraph不规则涟漪、波纹效果
实现概述 在本项目中,我们通过结合 Sine、Polar Coordinates 和 Time 节点,实现了动态波纹效果。以下是实现细节: 核心实现 Sine 波形生成: 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化,为波纹效果提供…...
【JavaScript】JavaScript开篇基础(6)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别
Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别 1. Spark RDD 是否支持窗口操作: RDD 本身没有专门的窗口操作算子。原因: RDD 是一个弹性分布式数据集,设计为通用的、不可变的操作单元,主要用于批处理场景。窗口函…...
http自动发送请求工具(自动化测试http请求)
点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中,HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求,我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…...
网络IP地址会经常换吗?深入解析与实操指南
在互联网的生态系统中,IP地址(Internet Protocol Address)是每台连接设备的唯一标识符,它在网络通信中起着至关重要的作用。然而,不少用户观察到自己的IP地址有时会发生变化,这引发了诸多疑问。本文旨在详细…...
MapLocNet由粗到细的定位网络
论文链接 MapLocNet: Coarse-to-Fine Feature Registration for Visual Re-Localization in Navigation Mapshttps://arxiv.org/html/2407.08561v1 问题背景 当前自动驾驶的定位主要依赖于高精度的地图和GPS信号,但在城市环境中,GPS信号易受到多路径传…...
【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?
目录 一、背景描述 二、解决办法 三、清理效果 四、理论参考 解决方法 1. 清理未使用的 Docker 镜像、容器和卷 2. 查看 Docker 使用的磁盘空间 3. 调整 Docker 的存储位置 4. 增加磁盘空间 5. 调整 Docker Desktop 配置 6. 使用 Docker 清理工具(例如 D…...
构建客服知识库:企业效率提升的关键步骤
客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题,还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…...
java-Day06 内部类 Lambda表达式 API
内部类 内部类:就是在一个类中定义一个类 格式例: public class Outer { public class Inner { } } 内部类分类 1.成员内部类(了解) 创建成员内部类 外部类.内部类 对象名new外部类().new内部类() 2.静态内部类(了解) 3.局部内部类(了解) 4.匿名内部类…...
Springboot配置全局异常通用返回
Springboot配置全局异常通用返回 前言 前端对接了部分接口后,开始抱怨,“后端接口出参的格式总是千奇百怪,没有一个固定的格式,错误信息提示也不明朗,业务的状态码总是东一个西一个,前端这都不好做统一的…...
计算机视觉在自动驾驶汽车中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 引言 计算机视觉在自动…...
wordpress functions文件的作用及详细说明
WordPress的functions.php文件是一个非常重要的主题文件,它允许开发者和用户向网站添加自定义代码片段,从而修改网站功能或添加新内容。以下是functions.php文件的主要作用和一些详细说明: 1. 自定义功能添加: functions.php文件…...
从电机控制实战看Q格式:TI C2000 DSP的定点数优化秘籍
电机控制实战:TI C2000 DSP中Q格式的定点数优化艺术 在实时电机控制系统中,计算效率和精度往往是一对矛盾体。当TI C2000系列DSP遇上无刷电机控制,Q格式定点数运算便成为平衡这对矛盾的关键技术。本文将深入探讨如何通过Q格式在资源受限的定点…...
z.lua 项目贡献指南:如何参与这个开源工具的开发
z.lua 项目贡献指南:如何参与这个开源工具的开发 【免费下载链接】z.lua :zap: A new cd command that helps you navigate faster by learning your habits. 项目地址: https://gitcode.com/gh_mirrors/zl/z.lua 欢迎来到 z.lua 项目贡献指南!z.…...
CLaMP技术深度解析:对比学习如何实现语言与音乐的完美融合
CLaMP技术深度解析:对比学习如何实现语言与音乐的完美融合 【免费下载链接】muzic 这是一个微软研究院开发的音乐生成AI项目。适合对音乐、音频处理以及AI应用感兴趣的开发者、学生和研究者。特点是使用深度学习技术生成音乐,具有较高的创作质量和听觉体…...
QT控件自适应布局实战:从零到窗口响应式设计
1. QT控件自适应布局入门指南 第一次接触QT界面开发时,最让我头疼的就是窗口大小变化后控件乱成一团的问题。记得当时做的一个小工具,在笔记本上运行好好的,接到大显示器上所有按钮都挤在左上角,简直惨不忍睹。后来摸索出这套自适…...
【经验贴】考过CDA数据分析师二级,从互联网公司转行大型国企下的数据分析统计部门经验
一、个人经历 2015年进了一家互联网公司,经过这几年的快速发展,到2020年的时候,我已经混到总监了。产品、运营、销售支持,这三方面的活都干过。也算是赶上了这波红利的尾巴,这些年也挣了点钱。 2020年后,…...
开源TeslaMate:重新定义特斯拉数据监控与分析体验
开源TeslaMate:重新定义特斯拉数据监控与分析体验 【免费下载链接】teslamate teslamate-org/teslamate: TeslaMate 是一个开源项目,用于收集特斯拉电动汽车的实时数据,并存储在数据库中以便进一步分析和可视化。该项目支持监控车辆状态、行驶…...
COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型(附分步屏蔽法)
COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型 面对COMSOL多物理场耦合模型报错时,许多工程师会陷入"哪里出错—如何修复"的循环焦虑。实际上,这类问题最有效的解决方式不是盲目修改参数,而是建立系统化的调试思…...
OpCore Simplify:开源工具驱动的OpenCore EFI高效配置技术方案
OpCore Simplify:开源工具驱动的OpenCore EFI高效配置技术方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题引入:Hacki…...
别再手动调参了!用C#和Halcon的HSmartWindow控件,5分钟搞定ROI绘制与参数提取
工业视觉开发革命:用C#封装Halcon ROI的智能实践 在半导体检测、精密零件测量等工业场景中,区域兴趣(ROI)的精准定义直接影响着算法效果。传统开发模式下,工程师需要反复在Halcon脚本与C#界面代码间切换,手…...
OpenClaw人人养虾:密钥管理
Gateway 提供安全的密钥管理(Secrets Management)功能,用于加密存储 API Key、Token 等敏感凭证,避免在配置文件中暴露明文。为什么需要密钥管理明文风险将 API Key 直接写在配置文件中存在严重安全风险:配置文件可能被…...
