You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React state中存储多个拖放文件且保留历史状态?

React拖拽上传保留历史文件状态解决方案

报错原因

你遇到的类型报错是因为uploadFiles声明为数组类型any[],但你调用setUploadFiles时传入了{ ...files, files }对象,类型不匹配导致报错。
如果直接写setUploadFiles(files)会覆盖之前的状态,是因为该写法直接用新拖入的文件替换了原有状态,没有保留历史数据。

解决代码

// 可将any[]优化为更精准的File[],类型提示更友好
const [uploadFiles, setUploadFiles] = useState<File[]>([]);

const onDropHandler = async (e:React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    const newFiles = Object.values(e.dataTransfer.files);
    // 采用函数式状态更新,拼接历史文件和新上传的文件
    setUploadFiles(prevFiles => [...prevFiles, ...newFiles]);
};

可选优化

如果需要避免重复添加相同文件,可在拼接前增加去重逻辑:

setUploadFiles(prevFiles => {
  const existFileKeySet = new Set(prevFiles.map(f => `${f.name}_${f.lastModified}`));
  const filteredNewFiles = newFiles.filter(f => !existFileKeySet.has(`${f.name}_${f.lastModified}`));
  return [...prevFiles, ...filteredNewFiles];
});

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 14:15:00