如果在回调函数中调用 useState,则不会重新渲染组件
useState not re-rendering component if it is called inside callback function
我有一个上传视频的组件,我正在尝试显示进度条。
这是我的核心代码。
const Upload = () => {
const [percent, setPercent] = useState(0);
console.log(percent); // This logs uploaded percentage every time progListener callback is called. From 0 to 100.
const dropAccepted = async () => {
const params = {...} // parameters to upload video like filename, file
await APIs.uploadVideo(params, progListener);
}
const progListener = (event) => {
var p = Math.round((event.loaded * 100) / event.total)
// console.log(p) logs uploaded percentage from 0 to 100
setPercent(p);
}
return (
<h6>{percent}</h6>
<Dropzone onDropAccepted={dropAccepted}/>
)
}
在 progListener 回调中,我已经用 setPercent 函数更新了百分比,所以我认为 h6 应该打印上传的百分比。但它始终为 0。
我的代码有什么问题?如果有任何帮助,我将不胜感激。
用 useRef 更新它,
useState不显示最新值的原因是因为useState是异步的。所以在你的情况下 useState 正在更新而不给它重新渲染的机会。在这些情况下,useRef 发挥更好的作用。
import React, {useRef} from "react";
const Upload = () => {
const percent = useRef(0);
const progListener = (event) => {
percent.current = Math.round((event.loaded * 100) / event.total)
}
return (
<h6>{percent.current}</h6>
<Dropzone onDropAccepted={dropAccepted}/>
)
}
我有一个上传视频的组件,我正在尝试显示进度条。 这是我的核心代码。
const Upload = () => {
const [percent, setPercent] = useState(0);
console.log(percent); // This logs uploaded percentage every time progListener callback is called. From 0 to 100.
const dropAccepted = async () => {
const params = {...} // parameters to upload video like filename, file
await APIs.uploadVideo(params, progListener);
}
const progListener = (event) => {
var p = Math.round((event.loaded * 100) / event.total)
// console.log(p) logs uploaded percentage from 0 to 100
setPercent(p);
}
return (
<h6>{percent}</h6>
<Dropzone onDropAccepted={dropAccepted}/>
)
}
在 progListener 回调中,我已经用 setPercent 函数更新了百分比,所以我认为 h6 应该打印上传的百分比。但它始终为 0。 我的代码有什么问题?如果有任何帮助,我将不胜感激。
用 useRef 更新它,
useState不显示最新值的原因是因为useState是异步的。所以在你的情况下 useState 正在更新而不给它重新渲染的机会。在这些情况下,useRef 发挥更好的作用。
import React, {useRef} from "react";
const Upload = () => {
const percent = useRef(0);
const progListener = (event) => {
percent.current = Math.round((event.loaded * 100) / event.total)
}
return (
<h6>{percent.current}</h6>
<Dropzone onDropAccepted={dropAccepted}/>
)
}