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
问题已确认 已加分
更多关于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-if
或v-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>