当前位置:首页 > React

react 实现扫码

2026-01-27 06:39:50React

React 实现扫码功能的方法

使用 react-qr-reader

安装 react-qr-reader 库:

npm install react-qr-reader

在组件中引入并使用:

import { QrReader } from 'react-qr-reader';

function ScanQRCode() {
  const [data, setData] = useState('');

  const handleScan = (result) => {
    if (result) {
      setData(result);
    }
  };

  const handleError = (err) => {
    console.error(err);
  };

  return (
    <div>
      <QrReader
        delay={300}
        onError={handleError}
        onScan={handleScan}
        style={{ width: '100%' }}
      />
      <p>Scanned Data: {data}</p>
    </div>
  );
}

使用 html5-qrcode

安装 html5-qrcode

npm install html5-qrcode

在组件中实现:

import { Html5QrcodeScanner } from 'html5-qrcode';

function ScanQRCode() {
  const [scanResult, setScanResult] = useState(null);

  useEffect(() => {
    const scanner = new Html5QrcodeScanner('reader', {
      qrbox: {
        width: 250,
        height: 250,
      },
      fps: 5,
    });

    scanner.render(success, error);

    function success(result) {
      scanner.clear();
      setScanResult(result);
    }

    function error(err) {
      console.warn(err);
    }
  }, []);

  return (
    <div>
      <div id="reader" style={{ width: '100%' }}></div>
      {scanResult && <p>Scanned Data: {scanResult}</p>}
    </div>
  );
}

使用原生 API 实现

通过浏览器的 getUserMedia API 访问摄像头:

react 实现扫码

function ScanQRCode() {
  const [scannedText, setScannedText] = useState('');

  const startScan = async () => {
    const stream = await navigator.mediaDevices.getUserMedia({ video: true });
    const video = document.getElementById('video');
    video.srcObject = stream;
    video.play();

    // 使用第三方库如 `jsqr` 解析视频流中的二维码
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    setInterval(() => {
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;
      context.drawImage(video, 0, 0, canvas.width, canvas.height);
      const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
      const code = jsQR(imageData.data, imageData.width, imageData.height);
      if (code) {
        setScannedText(code.data);
      }
    }, 100);
  };

  return (
    <div>
      <video id="video" style={{ width: '100%' }}></video>
      <button onClick={startScan}>Start Scan</button>
      <p>Scanned Data: {scannedText}</p>
    </div>
  );
}

注意事项

  • 确保应用运行在 HTTPS 环境下,某些浏览器限制摄像头访问。
  • 移动端设备可能需要处理横竖屏适配问题。
  • 提供用户友好的错误提示,如摄像头权限被拒绝时的处理。

以上方法可根据项目需求选择,react-qr-readerhtml5-qrcode 更适合快速集成,原生 API 提供更多自定义选项但实现复杂度较高。

标签: react
分享给朋友:

相关文章

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…

react如何重写alert

react如何重写alert

重写 React 中的 alert 方法 在 React 中,直接使用原生 alert 会破坏用户体验,通常需要自定义弹窗组件替代。以下是实现方法: 使用自定义弹窗组件 创建可复用的弹窗组件,替代原…

react 如何设置 代理

react 如何设置 代理

在 React 中设置代理 在开发过程中,为了跨域请求后端 API,可以通过配置代理来解决。以下是几种常见的设置代理的方法: 使用 package.json 配置代理 在 package.json…