当前位置:首页 > 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 访问摄像头:

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

安装 Node.js 和 npm React 项目依赖 Node.js 环境,需先安装 Node.js(自带 npm)。访问 Node.js 官网 下载 LTS 版本,运行安装程序并完成配置。安装后,…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…