我有一个功能组件,可以将文件保存到云存储中,并将对这些文件的引用保存到数据库中。选定文件后,这些文件将立即推送到云中(出于UX原因)。但是,除非用户单击“保存”,否则不会保存db对象(引用文件的URL)。如果用户选择了一些文件,但是在单击“保存”之前改变了主意,那么我想在卸载组件时删除这些文件。
我正在努力用useState
和useEffect
来实现这一点。
const [ files, setFiles] = useState([]);
const onFileAdded = fileURL => {
setFiles([ ...files, fileURL ])
}
useEffect(() => {
return () => {
files.forEach(f => storageAPI.removeFile(f));
}
}, []);
const onSave = () => {
setFiles([]);
}
在这种情况下,files
中的useEffect
变量是初始化值[]
。
如果我将files
变量传递给useEffect
useEffect(() => {
return () => {
files.forEach(f => storageAPI.removeFile(f));
}
}, [files]);
然后,只要更新files
变量,文件就会被删除。
这不是一个罕见的模式。我正在使用状态值来整理卸载后的组件。
正确的方法是什么?
答案 0 :(得分:1)
您可以使用useRef()。
const [ files, setFiles] = useState([]);
const filesRef = useRef(files);
const onFileAdded = fileURL => {
setFiles([ ...files, fileURL ])
}
useEffect(() => {
filesRef.current = files;
}, [files]);
useEffect(() => {
return () => {
filesRef.current.forEach(f => storageAPI.removeFile(f));
}
}, []);
const onSave = () => {
setFiles([]);
}