Reactjs React本机状态更新未按预期运行
我正在使用这个软件包。 我的状态是这样初始化的:Reactjs React本机状态更新未按预期运行,reactjs,react-native,setstate,Reactjs,React Native,Setstate,我正在使用这个软件包。 我的状态是这样初始化的: const [downloadFile, setDownloadFile] = useState({}); 在我从api获取数据之后 我更新我的状态: setDownloadFile({ thumbnail: 'https://img.youtube.com/vi/J6rVaFzOEP8/maxresdefault.jpg', heading: 'Guide To Be
const [downloadFile, setDownloadFile] = useState({});
在我从api获取数据之后
我更新我的状态:
setDownloadFile({
thumbnail:
'https://img.youtube.com/vi/J6rVaFzOEP8/maxresdefault.jpg',
heading: 'Guide To Becoming A Self-Taught Software Developer',
timing: 123,
status: 'Staring ...',
});
然后我使用这个包从url下载视频
const ts = RNBackgroundDownloader.download({
id: inputUrl,
url: 'url too long to display',
destination: `${RNBackgroundDownloader.directories.documents}/test.mp4`,
});
setTask(ts);
ts.begin(async (res) => {
await setDownloadFile({
...downloadFile,
timing: res / 1024,
});
console.log('onbegin', downloadFile);
});
ts.progress(async (pr) => {
await setDownloadFile({
...downloadFile,
status: `Downloading... ${Math.round(pr * 100)}%`,
});
console.log('onProgress', downloadFile);
});
ts.done(async () => {
await setDownloadFile({
...downloadFile,
status: 'done',
});
console.log('onDone', downloadFile);
});
我的问题是,计时变量中的.begin()中的状态更新没有在.progress()中进行
下载文件
是一个本地常量。它永远不会改变,这不是setDownloadFile
试图做的。设置状态的目的是通知组件重新启动。在下一次渲染中,将创建一个新的局部变量,该变量将获取新值
所以每次你这样做:
setDownloadFile({
...downloadFile
// etc
})
。。。您正在制作此闭包中的下载文件的副本。Ie,就是您调用RNBackgroundDownloader.downloader时存在的一个
最简单的修复方法是使用setDownloadFile的函数版本。您可以将一个函数传递给状态设置器,并使用最新状态调用它,然后您可以基于该状态创建新状态。例如:
ts.progress((pr) => {
setDownloadFile(previous => {
return {
...previous,
status: `Downloading... ${Math.round(pr * 100)}%`,
}
});
});
我删除了async/await,因为设置状态不返回承诺,所以没有任何作用。我也删除了日志记录。如果需要,需要将其放入函数中。downloadFile
是一个本地常量。它永远不会改变,这不是setDownloadFile
试图做的。设置状态的目的是通知组件重新启动。在下一次渲染中,将创建一个新的局部变量,该变量将获取新值
所以每次你这样做:
setDownloadFile({
...downloadFile
// etc
})
。。。您正在制作此闭包中的下载文件的副本。Ie,就是您调用RNBackgroundDownloader.downloader时存在的一个
最简单的修复方法是使用setDownloadFile的函数版本。您可以将一个函数传递给状态设置器,并使用最新状态调用它,然后您可以基于该状态创建新状态。例如:
ts.progress((pr) => {
setDownloadFile(previous => {
return {
...previous,
status: `Downloading... ${Math.round(pr * 100)}%`,
}
});
});
我删除了async/await,因为设置状态不返回承诺,所以没有任何作用。我也删除了日志记录。如果需要,您需要将其放入函数中。工作正常,谢谢,谢谢