文档
API

BarcodeScannerProvider

BarcodeScannerProvider 用于创建相互隔离的媒体流和闪光灯作用域。Provider 是可选的;Provider 外部的 hooks 会继续使用全局兼容作用域。

名称类型默认值说明
initialTorchOnbooleanfalseProvider store 创建时读取一次的闪光灯初始状态。
childrenReactNode必填属于该作用域的扫码器和状态消费者。
<BarcodeScannerProvider initialTorchOn={false}>
  <BarcodeScanner />
  <ScannerControls />
</BarcodeScannerProvider>

useStreamState()useTorch() 会解析距离最近的 Provider。不同 Provider 互相隔离;没有 Provider 时则解析模块级全局兼容 store。

状态归属、生命周期、闪光灯异步行为和 SSR 的完整说明见状态作用域与多实例

BarcodeScanner

除了下列属性,BarcodeScanner 也支持 React 标准的 video 元素属性:

名称类型默认值说明
optionsScanOptionsDEFAULT_OPTIONS扫描间隔和条码格式。
onCapture(barcodes: DetectedBarcode[]) => void检测到一个或多个条码后调用。
onCameraError(error: Error) => void相机初始化失败时调用。
onScanError(error: Error) => void条码检测失败时调用。
trackConstraintsMediaTrackConstraintsDEFAULT_CONSTRAINTS额外的视频轨道约束。
pausedbooleanfalse在不卸载组件的情况下暂停视频和扫描。

useCamera

function useCamera(
  ref: RefObject<HTMLVideoElement | null>,
  trackConstraints?: MediaTrackConstraints
): {
  isCameraReady: boolean
  error: Error | undefined
}

创建相机媒体流、绑定到 video 元素,并暴露初始化错误。

DEFAULT_CONSTRAINTS

{
  width: { min: 640, ideal: 1280 },
  height: { min: 480, ideal: 720 },
  facingMode: { ideal: 'environment' },
  advanced: [
    { width: 1920, height: 1280 },
    { aspectRatio: 1.333 }
  ]
}

useScanning

function useScanning(
  ref: RefObject<HTMLVideoElement | null>,
  options?: ScanOptions
): {
  detectedBarcodes: DetectedBarcode[] | undefined
  error: Error | undefined
  startScan: () => void
  stopScan: () => void
}

创建检测器前会等待 react-barcode-scanner/polyfill 加载完成;只要 formats 不变,就会复用同一个检测器。

DEFAULT_OPTIONS

{
  delay: 1000,
  formats: ['qr_code']
}

useTorch

function useTorch(defaultTorchOn?: boolean): {
  isTorchSupported: boolean
  error: Error | undefined
  isTorchOn: boolean
  setIsTorchOn: (torch: boolean) => void
}

闪光灯是否可用取决于当前相机轨道以及浏览器、设备能力。

useStreamState

function useStreamState(): [
  MediaStream | undefined,
  (newState: MediaStream | undefined) => void
]

用于在 BarcodeScanner 外部的组件中读取或更新 useCamera 创建的媒体流。

没有 BarcodeScannerProvider 时,useStreamStateuseTorch 使用模块级共享状态。如果页面同时运行多个扫码器,应分别用 Provider 包裹每个扫码器及其消费者。

Types

ScanOptions

interface ScanOptions {
  delay?: number
  formats?: Array<BarcodeFormat | string>
}

DetectedBarcode

interface DetectedBarcode {
  boundingBox: DOMRectReadOnly
  cornerPoints: Point[]
  format: string
  rawValue: string
}