使用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函数组合才能实现连续的聚焦,输入,清空的功能。

Logo

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

更多推荐