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,因为设置状态不返回承诺,所以没有任何作用。我也删除了日志记录。如果需要,您需要将其放入函数中。

工作正常,谢谢,谢谢