当前位置:首页 > React

react 实现扫码

2026-01-27 06:39:50React

React 实现扫码功能的方法

使用 react-qr-reader

安装 react-qr-reader 库:

npm install react-qr-reader

在组件中引入并使用:

react 实现扫码

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

react 实现扫码

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 访问摄像头:

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如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

如何下载react

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react 如何精通

react 如何精通

掌握核心概念 深入理解React的基础概念,包括组件(函数组件与类组件)、状态(useState)、生命周期(useEffect)、Props传递、虚拟DOM与Diff算法。通过官方文档或《React…

react如何重新加载

react如何重新加载

重新加载当前页面 在React中重新加载当前页面可以通过window.location.reload()方法实现。该方法会强制浏览器重新加载当前URL,类似于按下F5刷新页面。 const relo…

react如何检测窗口

react如何检测窗口

监听窗口大小变化 使用useEffect钩子和resize事件监听窗口尺寸变化。在组件挂载时添加事件监听器,卸载时移除监听器以避免内存泄漏。 import { useState, useEffect…

react如何代码优化

react如何代码优化

减少不必要的重新渲染 使用 React.memo 包装函数组件以避免在 props 未变化时重新渲染。对于类组件,可以通过 shouldComponentUpdate 或继承 PureComponen…