【发布时间】:2020-07-19 05:26:47
【问题描述】:
我想创建一个简单的文件上传器,我已经有来自 dropzone 拖放的listOfFiles。
文件的简单循环
{listOfFiles.map((file, i) => (
<SingleFile
key={i}
index={i}
file={file}
handleDelete={handleDelete}
/>
))}
在SingleFile 内部,当使用useEffect 进行组件挂载时,我会调用axios API 来上传文件,简化为:
useEffect(() => {
if (!props.file) return;
// ...
// Axios call and bunch of states changes.
// ...
}, [props.file]);
上传过程很好,当我拖动其他文件时它可以工作,新文件添加到listOfFiles,然后开始上传。
现在,当我点击SingleFile 内的删除按钮时,父组件上的handleDelete 会触发以删除具有特定索引的文件。
<button onClick={props.handleDelete(index)}> Delete </button>
在handleDelete
setListOfFiles((listOfFiles) => listOfFiles.filter((f, i) => i !== index));
现在的问题是,当我删除 SingleFile 时,listOfFiles 数组被更新并且每个数组元素是 SingleFile 组件被重新渲染,并且再次调用上传 axios 调用......等等.
当另一个实例发生变化时,有没有办法不重新渲染组件的实例?让它在重新渲染时仅取决于它的状态/道具?并通过父数组中的唯一 id 或索引来控制它的挂载/卸载。
【问题讨论】:
标签: javascript reactjs