首页 > 其他分享 >vue 扫码枪获取条形码逻辑

vue 扫码枪获取条形码逻辑

时间:2023-06-28 18:12:15浏览次数:53  
标签:条形码 扫码 vue instantCode lastCode state lastTime

直接贴代码

<template>
    <div class="demo-container">
        <el-input 
            onkeyup="value=value.replace(/\D|/g,'')"
            v-model="codeValue" 
            ref="codeInputElem" 
            placeholder="使用扫码枪前,请保持此输入框在聚焦状态" 
            clearable
        >
        </el-input>
    </div>
</template>

<script>
import { onMounted, reactive, toRefs } from 'vue';
import { ElMessage } from 'element-plus'
export default {
    name: "Basic",
    setup() {
        const state = reactive({
            codeInputElem: null,  //输入框元素实例

            codeValue: "",  //输入框绑定值
            instantCode: "",  //实时的值
            lastTime: "",
            nextTime: "",
            lastCode: "",
            nextCode: ""
        })

        onMounted(()=>{
            getFocus()  //帮助用户自动聚焦
            window.onkeypress = (e) => {
                watchKeyPress(e)
            }
        })

        // 输入框聚焦
        function getFocus(){
            state.codeInputElem.focus()
        }

        //监听键盘按下事件(包括扫码枪触发的事件)并进行处理
        function watchKeyPress(e){
            if (window.event) {  // IE
                state.nextCode = e.keyCode;
            } else if (e.which) {  // Netscape/Firefox/Opera
                state.nextCode = e.which;
            }
            if (e.which === 13) { // 键盘回车事件
                if (state.instantCode.length < 3) return; // 扫码枪的速度很快,手动输入的时间不会让code的长度大于2,所以这里不会对扫码枪有效
                // console.log("扫码结束。");
                // console.log("条形码:", state.instantCode);
                parseQRCode(state.instantCode); // 获取到扫码枪输入的内容,做别的操作
                state.lastCode = "";
                state.lastTime = "";
                return;
            }
            state.nextTime = new Date().getTime();
            if (!state.lastTime && !state.lastCode) {
                state.instantCode = ""; // 清空上次的条形码
                state.instantCode += e.key;
                // console.log("扫码开始---", state.instantCode);
            }
            if (state.lastCode&&state.lastTime&&state.nextTime-state.lastTime>500) {  // 当扫码前有keypress事件时,防止首字缺失
                state.instantCode = e.key;
                // console.log("防止首字缺失。。。", state.instantCode);
            } else if (state.lastCode && state.lastTime) {
                state.instantCode += e.key;
                // console.log("扫码中。。。", state.instantCode);
            }
            state.lastCode = state.nextCode;
            state.lastTime = state.nextTime;
        }
        function parseQRCode(code) {
            if (code.length === 0) {
                ElMessage.warning("条形码不能为空,请重试");
                return
            }else if(code.length > 16){
                ElMessage.warning("条形码格式不正确,请重试");
                return
            }

            state.codeValue = code;
            checkCode()  // 这里可发送网络请求
        }

        // 调取接口验证条形码
        function checkCode(){
            //......
        }

        return {
            ...toRefs(state)
        }
    },
};
</script>

<style scoped lang="less">
.demo-container {
    
}
</style>

标签:条形码,扫码,vue,instantCode,lastCode,state,lastTime
From: https://www.cnblogs.com/huihuihero/p/17512168.html

相关文章

  • vue 弹框分左右两部分
    <divclass="dialog_diy"><el-dialog:visible.sync="otherShow":close-on-click-modal='true'width="40%"height="80%"><divslot="title"class="header-title"......
  • Vue.js 渲染函数和 JSX
    学习目录:Vue.js简介Vue.js实例与数据绑定Vue.js计算属性和侦听器Vue.js条件渲染和列表渲染Vue.js事件处理Vue.js表单输入绑定Vue.js组件基础Vue.js组件通信Vue.js插槽Vue.js动态组件和异步组件Vue.js自定义指令Vue.js过渡和动画Vue.js混入Vue.js自定义事件和v-model......
  • vue-element table表格排序推拽功能
    //1.安装sortablejsnpminstallsortablejs--save//2.功能页面中引入importSortablefrom‘sortablejs’具体使用(注意:elementtable务必指定row-key,且row-key必须是唯一的,如id,不然会出现排序不对的情况)<el-tablerow-key="id":data="tableData"style="width:......
  • 2023.6.28 - vue项目打包内存堆栈溢出JS stacktrace
    vue项目打包时报错,JSstacktrace:ReachedheaplimitAllocationfailed-JavaScriptheapoutofmemory这是因为node打包时是有内存空间限制的,node能分配多少空间,默认是根据电脑内存占比来算的。在内存比较小的电脑里,默认分配给node的内存可能不足以支撑起项目运行或者打包......
  • vue3+vite+js配置路径别名
    1、让vscode认识@符号项目下新建jsconfig.json,配置baseUrl,paths参数{"compilerOptions":{"target":"esnext","useDefineForClassFields":true,"module":"esnext","moduleResolution&q......
  • VUE http大文件断点续传上传
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • vue中watch侦听器,deep和immediate的用法
    1、deep深度监听的用法当监听一个对象时,可能想监听整个对象的变化,而不仅仅是某个属性。但在默认情况下,如果你正在监听formData对象并且修改了formData.username,对应的侦听器并不会触发,它只在formData对象被整个替换时触发。监听整个对象被称作深度监听,通过将deep选项设置为true......
  • 深入剖析:Vue核心之虚拟DOM
    前言使用Vue做项目也有两年时间了,对Vue的api也用的比较得心应手了,虽然对Vue的一些实现原理也耳有所闻,例如虚拟DOM、flow、数据驱动、路由原理等等,但是自己并没有特意去探究这些原理的基础以及Vue源码是如何利用这些原理进行框架实现的,所以利用空闲时间,进行Vue框架相......
  • vue定时器
    exportdefault{methods:{fun1(){consttimer=setInterval(()=>{//需要做的事情},1000);//通过$once来监听定时器,在beforeDestroy钩子可以被清除。this.$once('hook:beforeDestroy',()=>{clearInterval(timer);......
  • VUE框架组件中通信方式(4)
    ref-children-parentref方法既可以获取真实的DOM节点,还可以获取到子组件的实例VC,$parent可以在子组件中获取父组件的实例VC,使用方式是在子组件的方法中传入的参数只能是$parent如:<button@click="handler($parent)">点击我爸爸给我10000元</button>示例代码如下;//父组件代码<......