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上有偏差,还是需要熟读文档。还是那句话代码代码千千万,适合自己最重要。

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

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

相关文章

报错 No available slot found for the embedding model

报错内容 Server error: 503 - [address0.0.0.0:12781, pid304366] No available slot found for the embedding model. We recommend to launch the embedding model first, and then launch the LLM models. 目前GPU占用情况如下 解决办法: 关闭大模型, 先把 embedding mode…

AI大模型(二):AI编程实践

一、软件安装 1. 安装 Visual Studio Code VSCode官方下载&#xff1a;Visual Studio Code - Code Editing. Redefined 根据自己的电脑系统选择相应的版本下载 安装完成&#xff01; 2. 安装Tongyi Lingma 打开VSCode&#xff0c;点击左侧菜单栏【extensions】&#xff0c;…

MFC程序崩溃时生成dmp文件

#include “HiExceptionHandle.h” #include <string> #pragma once class HiExceptionHandle { public:HiExceptionHandle(void);~HiExceptionHandle(void); public:void RunCrashHandler();void SetWERDumpLocation(const std::wstring dumpFolderPath); protected:st…

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o

在不断发展的人工智能领域&#xff0c;Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用&#xff0c;突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)

目录 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&#xff0c;在团结引擎内可以直接使用Screen.safeArea 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&am…

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…

SpringCloud-使用FFmpeg对视频压缩处理

在现代的视频处理系统中&#xff0c;压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具&#xff0c;广泛应用于音视频的处理&#xff0c;包括视频的压缩和格式转换等。本文将通过Java代码示例&#xff0c;向您展示如何使用FFmpeg进行视…

MySQL-初识数据库

目录 一、数据库基础概念 1、SQL 2、数据&#xff08;Data&#xff09; 3、数据库&#xff08;DB&#xff09; 4、数据库管理系统DBMS 5、数据库系统DBS 6、关系模型&#xff08;Relational Model&#xff09; 7、E-R图 8、常见的数据库 9、数据库基本操作 一、数据库…

【C语言】实现二维数组按列排序

文章目录 代码实现代码解释注意事项 代码实现 下面是一个C语言程序&#xff0c;它读取用户输入的4行5列的二维数组&#xff0c;并按照列对数组进行排序。 #include <stdio.h>int main() {int a[4][5]; // 定义一个4行5列的二维数组// 读取用户输入的二维数组for (int i…

aws ses 设置发件人昵称

看到别人的发的都是有昵称的&#xff0c;自己发的就是直接展示noreply 其实很简单&#xff1a; 只需要把发件人改成“nickname<noreplyxxx.com>”就行了

51c大模型~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/11859244 #猎户座 「草莓」即将上线&#xff0c;OpenAI新旗舰大模型曝光&#xff0c;代号「猎户座」 ChatGPT 要进化了&#xff1f; 本月初&#xff0c;OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片&#xff0…

【算法】二分查找

基本内容 提高在有序的数组中查找满足某一条件的索引 二分查找的基本类型 ① 有多种情况满足条件&#xff0c;找到满足条件的最右索引&#xff0c;例如找到值为4的最右索引&#xff08;也可以换为小于5的最后一个元素&#xff09; ​ ② 有多种情况满足条件&#xff0c;找到满…

PCA 原理推导

针对高维数据的降维问题&#xff0c;PCA 的基本思路如下&#xff1a;首先将需要降维的数据的各个变量标准化&#xff08;规范化&#xff09;为均值为 0&#xff0c;方差为 1 的数据集&#xff0c;然后对标准化后的数据进行正交变换&#xff0c;将原来的数据转换为若干个线性无关…

Selective attention improves transformer详细解读

Selective attention improves transformer Google 2024.10.3 一句话&#xff1a;简单且无需额外参数的选择性注意力机制&#xff0c;通过选择性忽略不相关信息并进行上下文剪枝&#xff0c;在不增加计算复杂度的情况下显著提升了Transformer模型的语言建模性能和推理效率。 论…

卡尔曼滤波:从理论到应用的简介

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种递归算法&#xff0c;用于对一系列噪声观测数据进行动态系统状态估计。它广泛应用于导航、控制系统、信号处理、金融预测等多个领域。本文将介绍卡尔曼滤波的基本原理、核心公式和应用案例。 1. 什么是卡尔曼滤波&#x…

tdengine学习笔记

官方文档&#xff1a;用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式&#xff0c;高可靠&#xff0c;支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的&#xff0c;包含…

ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言 本篇文章介绍的是ROS高效进阶内容&#xff0c;使用URDF 语言&#xff08;xml格式&#xff09;做一个差速轮式机器人模型&#xff0c;并使用URDF的增强版xacro&#xff0c;对机器人模型文件进行二次优化。 差速轮式机器人&#xff1a;两轮差速底盘由两个动力轮位于底盘左…

VPI photonics的一些使用经验(测相位 快速搜索)持续更新

1.使用FuncSinEl模块的注意事项&#xff1a; 2.在VPI player&#xff08;示波器&#xff09;测电信号相位时候&#xff0c;可以使用正则表达式&#xff0c;快速搜索。 比如我要搜索以30开头的数据&#xff0c;输入&#xff1a; ^30 其他的正则表达式不适用&#xff0c;比如以…