uni-app 【NVUE】多个input框输入确认后自动聚焦 光标问题以及偶发聚焦问题

uni-app 【NVUE】多个input框输入确认后自动聚焦 光标问题以及偶发聚焦问题

开发环境 版本号 项目创建方式
Windows win10专业版 1909 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:win10专业版 1909

HBuilderX类型:正式

HBuilderX版本号:3.3.13

手机系统:Android

手机系统版本号:Android 12

手机厂商:模拟器

手机机型:预设机型(mi 10 pro)

页面类型:nvue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

App下载地址或H5网址: [还未上传 (会上传示例代码) 示例代码路径:pages/componentsC/input/input.nvue 切换可清空input框和数字键盘input框](//ask.dcloud.net.cn/还未上传 (会上传示例代码) 示例代码路径:pages/componentsC/input/input.nvue 切换可清空input框和数字键盘input框)

示例代码:

<view class="u-demo-block"> <text class="u-demo-block__title">可清空内容</text> <view class="u-demo-block__content"> <u--input ref="clearInput" placeholder="请输入内容" border="surround" clearable @confirm="contentConfirm" @blur="contentBlur" @focus="contentFocus" v-model="content" ></u--input> </view> </view> <view class="u-demo-block"> <text class="u-demo-block__title">数字键盘</text> <view class="u-demo-block__content"> <u--input ref='numberInput' placeholder="请输入内容" @blur="numberBlur" @focus="numberFocus" border="surround" type="number" clearable v-model="number" ></u--input> </view> </view> ```

methods: {
// 确认input框
contentConfirm(){
this.$refs[‘numberInput’].focus=true
// console.log(this.$refs[‘numberInput’].cursor,‘cursor’)
},
// 失焦
contentBlur(){
console.log(‘content失焦啦’)
// this.$refs[‘clearInput’].focus=false
},
//聚焦
contentFocus(){
// this.$refs[‘clearInput’].focus=true
console.log(‘content聚焦啦’)
},
//确认数字键盘框
numberConfirm(){
console.log(‘确认数字’)
},
// 数字键盘失焦
numberBlur(){
// this.$refs[‘numberInput’].focus=false
console.log(‘number失焦啦’)
},
// 数字键盘聚焦
numberFocus(){
// this.$refs[‘numberInput’].focus=true
console.log(‘number聚焦啦’)
},
codeChange(text) {
this.tips = text;
},
getCode() {
if (this.$refs.uCode.canGetCode) {
// 模拟向后端请求验证码
uni.showLoading({
title: ‘正在获取验证码’
})
setTimeout(() => {
uni.hideLoading();
// 这里此提示会被this.start()方法中的提示覆盖
uni.$u.toast(‘验证码已发送’);
// 通知验证码组件内部开始倒计时
this.$refs.uCode.start();
}, 2000);
} else {
uni.$u.toast(‘倒计时结束后再发送’);
}
},
change(e) {
console.log(‘change’, e);
}
}


更多关于uni-app 【NVUE】多个input框输入确认后自动聚焦 光标问题以及偶发聚焦问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

问题已确认 已加分

更多关于uni-app 【NVUE】多个input框输入确认后自动聚焦 光标问题以及偶发聚焦问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


nvue的input组件 获取焦点请使用focus() .官方文档有说明的。不过uView的u–input并未封装你可以联系下开发者修改下 通过focus属性实现获取焦点会有些问题

你好 我改成这样实现了

但会出现一种情况,就是我按下确认键的时候,会从第1个input框,跳到第三个input框当中并聚焦

回复 pure111: 切换input的bug问题我们已经确认了 只是提示用focus属性存在问题

回复 DCloud_Android_ST: 好的谢谢

您可以试一下,使用confirmHold="true"来解决问题。代码如下
<u–input
ref=‘numberInput’
placeholder=“请输入内容”
@blur=“numberBlur”
@focus=“numberFocus”
border=“surround”
type=“number”
clearable
v-model=“number”
confirmHold=“true”
></u--input> 跳转到第三个input这边没有复现。
扩展组件的代码如下,其中input组件ref设置为root。 //u–input
export default {
name: ‘u–input’,
mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
components: {
uvInput
},
methods:{
focus1() {
this.$refs.root.focus1();
}
}
}

//u-input
focus1(){
this.$refs.root.focus();
},

试了下 是可以的,不过我们这个是rf扫描,我是扫描完一个值,校验是否正确,正确的话就会自动聚焦到下一个输入框,同时还会用uni.hideKeyboard() 隐藏键盘,现在的这个confirmHold不是控制键盘一直存在的嘛,现在安卓模拟器上是ok的,不过还没进行真机测试,测试了之后会上来反馈

回复 pure111: 可以的 ,有问题随时反馈。

在使用 uni-app 的 NVUE 开发时,处理多个 input 框的自动聚焦和光标问题可能会遇到一些挑战,尤其是偶发的聚焦问题。以下是一些常见的解决方案和注意事项:

1. 自动聚焦问题

在 NVUE 中,input 组件的自动聚焦可以通过 focus 属性来实现。但是,由于 NVUE 的渲染机制和原生组件的限制,可能会出现聚焦不成功的情况。

解决方案:

  • 使用 nextTick:在确认输入后,使用 uni.nextTick 来确保 DOM 更新完成后再进行聚焦操作。

    uni.nextTick(() => {
      this.$refs.input2.focus();
    });
    
  • 手动触发聚焦:在某些情况下,可能需要手动触发聚焦事件,例如通过 setTimeout 延迟聚焦。

    setTimeout(() => {
      this.$refs.input2.focus();
    }, 100);
    

2. 光标问题

在 NVUE 中,input 组件的光标可能会因为聚焦顺序或渲染问题而出现异常,例如光标位置不正确或光标闪烁。

解决方案:

  • 确保 input 组件正确渲染:在聚焦之前,确保 input 组件已经正确渲染到页面上。可以通过 v-ifv-show 来控制 input 的显示。

    <input v-if="showInput" ref="input2" />
    
  • 设置 cursor 属性:在某些情况下,可以通过设置 cursor 属性来控制光标的位置。

    this.$refs.input2.setSelectionRange(position, position);
    

3. 偶发聚焦问题

偶发的聚焦问题可能是由于 NVUE 的渲染机制或事件处理顺序导致的。以下是一些可能的解决方案:

解决方案:

  • 避免频繁的 DOM 操作:频繁的 DOM 操作可能会导致聚焦问题,尽量减少不必要的 DOM 更新。

  • 使用 focus 事件:在 input 组件的 focus 事件中处理聚焦逻辑,确保聚焦操作在正确的时间执行。

    <input [@focus](/user/focus)="handleFocus" />
    
    methods: {
      handleFocus() {
        // 处理聚焦逻辑
      }
    }
    
  • 检查事件冒泡:确保没有其他事件阻止了 input 组件的聚焦操作。

4. 综合示例

以下是一个综合示例,展示了如何在多个 input 框之间实现自动聚焦,并处理光标和偶发聚焦问题:

<template>
  <view>
    <input ref="input1" v-model="value1" @confirm="focusInput2" />
    <input ref="input2" v-model="value2" v-if="showInput2" [@focus](/user/focus)="handleFocus" />
  </view>
</template>

<script>
export default {
  data() {
    return {
      value1: '',
      value2: '',
      showInput2: false
    };
  },
  methods: {
    focusInput2() {
      this.showInput2 = true;
      uni.nextTick(() => {
        this.$refs.input2.focus();
      });
    },
    handleFocus() {
      // 处理聚焦逻辑
    }
  }
};
</script>
回到顶部