[英]Unable to set previousCode state using useState hook in React
我是新來的反應和 javascript 並且不明白為什么setPreviousCode
沒有改變 state。 我想將以前掃描的文本存儲在previousCode
中。
import React, { useEffect, useState } from "react"
import { Html5Qrcode } from "html5-qrcode"
import { useCallback } from "react"
let html5QrCode
const brConfig = {
fps: 10,
qrbox: { width: 300, height: 150 },
disableFlip: false,
}
export const Scanner = () => {
const beep = new Audio("https://www.soundjay.com/buttons/beep-08b.mp3")
const [previousCode, setPreviousCode] = useState(null)
useEffect(() => {
html5QrCode = new Html5Qrcode("reader")
startScan()
}, [])
const startScan = useCallback(() => {
console.log("imrunngin")
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
if (previousCode !== decodedText) {
beep.play()
setPreviousCode(decodedText)
}
}
html5QrCode.start(
{ facingMode: "environment" },
brConfig,
qrCodeSuccessCallback
)
}, [])
const handleStop = () => {
try {
html5QrCode
.stop()
.then((res) => {
html5QrCode.clear()
console.log("stopped")
})
.catch((err) => {
console.log(err.message)
})
} catch (err) {
console.log(err)
}
}
return (
<div style={{ position: "relative", backgroundColor: "#1E1E1E" }}>
<div id="reader" width="100%" />
</div>
)
}
當您更新 state 屬性時,相對於其先前的值,使用 state 設置器的回調參數*。 否則可能會考慮陳舊的 state 值。
https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous
嘗試,
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
setPreviousCode((previousCode)=> {
if (previousCode !== decodedText) {
beep.play()
return decodedText;
}
return previousCode
});
}
甚至更好(state 設置器是純的):
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
setPreviousCode((previousCode)=> (previousCode !== decodedText) ?decodedText:previousCode
});
}
useEffect(()=>{
beep.play();
}, [previousCode]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.