You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js中无需Input元素获取条码扫描数据并存入state的方法

无需Input元素实现条码扫描数据捕获(React.js)

当然可以实现,条码阅读器本质是模拟快速键盘输入,我们可以通过监听全局键盘事件来捕获扫描数据,完全不需要依赖Input元素。

实现思路

  • 组件挂载时给document添加全局keydown事件监听,卸载时移除监听避免内存泄漏
  • 用临时变量收集连续的扫描按键字符
  • 利用扫描器默认在条码末尾添加的回车键作为扫描结束标志,此时将收集到的条码存入state并清空临时字符

完整代码实现

import { useState, useEffect } from 'react';
import { Stack } from '@mui/material';

export default function ScanCheckForm() {
  const [barcodeValue, setBarcodeValue] = useState('');
  // 临时存储扫描过程中的字符
  let scannedChars = '';

  useEffect(() => {
    const handleKeyDown = (event) => {
      // 只收集可打印的单个字符,排除Shift、Ctrl等功能键
      if (event.key.length === 1) {
        scannedChars += event.key;
      }
      // 扫描器通常以回车键结束扫描,此时将数据存入state
      if (event.keyCode === 13 && scannedChars) {
        setBarcodeValue(scannedChars);
        console.log('扫描到的条码:', scannedChars);
        scannedChars = '';
      }
    };

    // 注册全局键盘监听
    document.addEventListener('keydown', handleKeyDown);

    // 组件卸载时移除监听,防止内存泄漏
    return () => {
      document.removeEventListener('keydown', handleKeyDown);
    };
  }, []);

  return (
    <Stack spacing={3}>
      <div>当前扫描到的条码: {barcodeValue}</div>
    </Stack>
  );
}

补充说明

  • 若你的扫描器未配置回车键作为结束符,可以通过按键时间间隔判断:连续按键间隔小于100ms判定为扫描输入,否则视为手动输入(需额外维护时间戳变量)
  • 该方案不受页面焦点影响,只要页面处于激活状态就能捕获扫描数据

内容的提问来源于stack exchange,提问作者Irfan Arif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:39:27