
PDA扫描点数:uni-app的APP程序,令uni-easy-input连续自动获取焦点,重复在同一个input内输入数据(需要隐藏软键盘)
uni-app的APP程序,令uni-easy-input连续自动获取焦距,重复在同一个input内输入数据,并隐藏软键盘
使用UNI-APP开发PDA(Android系统)的扫码点货功能,在这个需求中需要再一个uni-easy-input中连续获取焦点,通过PDA的扫描枪连续获取条形码数据。
方法很简单,主要是使用@focus事件和focus属性来完成连续聚焦,@confirm处理扫描到的参数,@blur失去焦点后的响应事件。思路很清晰,但问题是,在实操上,很容易出现聚焦失败,或者聚焦成功但是输出框中的数据没有按逻辑清空,我经过几次测试后,发现可以使用setTimeout延迟函数和this.$nextTick 的回调函数来实现。
具体实现过程来看代码:
页面代码:
<uni-section title="扫描" type="line"> <uni-easyinput type="text" :focus="focusSkuNo" placeholder="扫描或输入" v-model="scanSkuNo" @confirm="inputSkuNo" @blur="()=>{focusSkuNo=false}" @focus="keyboardheightchange"> </uni-easyinput> </uni-section>
@confirm="inputSkuNo" 按下 回车键/PDA扫描后 的回调函数
@blur="()=>{focusSkuNo=false}" 失去焦点后自动将焦点变量设为false,防止DOM刷新后重新聚焦失败
@focus="keyboardheightchange" 获取焦点后关闭软键盘,这里有个缺点,软键盘会发生闪出。(没办法,需求有点呆,典型的既要又要,既要能扫描,又要能手动输入,不能把软键盘真的禁止弹出。)
需要的变量:
data (){ return { scanSkuNo: "",//输出框双绑定的变量 skuNo:"",//实际需要保存的变量 focusSkuNo: false,//是否自动聚焦 pickUpNumerNow:0,//计数 }
函数方法:
method(){ inputSkuNo(){ if (this.skuNo == this.scanSkuNo) { this.pickUpNumerNow++ //0.5s后清空input的内容,并在下一次DOM刷新后重新获取焦距 setTimeout(()=>{ this.scanSkuNo = null //清空input的内容 this.$nextTick(() => { //扫描Sku编码的input获取焦距 this.focusSkuNo = true }) },500) } }, keyboardheightchange() { //对于app程序,键盘弹出后0.2秒后关闭软键盘, //软键盘可以弹出隐藏后,手动聚焦即可不再隐藏 setTimeout(() => { //#ifdef APP-PLUS uni.hideKeyboard() // #endif }, 200) }, }
如果需要在进入页面就自动聚焦到输入框可以在created中加入一下方法
created() { var that = this //创建页面后0.5秒聚焦到输入框 setTimeout(() => { that.focusSkuNo = true }, 500) }
值得注意的是,对于uni-easy-input(普通input也一样),组件属性focus,同一个页面如果有多个设置了 :focus=“true” 的input,那么只有最后一个设置的 focus=true 生效。
在PDA实际测试中发现,需要先用一个setTimeOut,在里面再用this.$nextTick函数组合才能实现连续的聚焦,输入,清空的功能。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)