我想使用QrReader根據[https://github.com/Musawirkhann/react_qrcode_generation_scanner
它是由react寫的。但是我想用tsx。
在qrRef.current.openImageDialog()
中有一個錯誤Object is possibly 'null'. TS2531
import React, { useState, useRef } from 'react'
import QrReader from 'react-qr-reader'
type ScanFileState = {
scanResultFile: string
setScanResultFile: React.Dispatch<React.SetStateAction<string>>
qrRef: React.MutableRefObject<null>
}
const ScanFile: React.FC<ScanFileState> = () => {
const qrRef = useRef(null)
const [scanResultFile, setScanResultFile] = useState('')
const handleErrorFile = (error) => {
alert(error)
}
const handleScanFile = (result) => {
if (result) {
setScanResultFile(result)
}
}
const onScanFile = () => {
qrRef.current.openImageDialog()
}
return (
<div>
<button type='button' onClick={onScanFile}>Scan Qr Code</button>
<QrReader ref={qrRef}
delay={300}
style={{ width: '100%' }}
onError={handleErrorFile}
onScan={handleScanFile}
legacyMode />
<h3>Scanned Code: <a href={scanResultFile}>{scanResultFile}</a></h3>
</div>
)
}
export default ScanFile
我試著使用as
。但是沒有起作用。錯誤也變為Property 'openImageDialog' does not exist on type 'HTMLButtonElement'. TS2339
const onScanFile = () => {
if (!qrRef) {
return
}
(qrRef.current as HTMLButtonElement).openImageDialog()
}
你必須在這里做兩件事。首先讓typescript知道您正在創建的引用是QrReader:
然后,由于ref在渲染啟動時可以為null,因此在調用
openImageDialog
時使用可選的鏈接操作符:你可以在這里找到更多關于可選鏈接的信息。