我试图创建React图像库应用程序一切都工作完美,但每次我上传图像,它被上传两次,我不知道为什么...
下面是负责上传图像的useStorage
钩子
import { useState, useEffect } from "react";
import { fireStorage, fireStore } from "../firebase/firebase-config";
import { ref, getDownloadURL, uploadBytesResumable } from "firebase/storage";
import { collection, addDoc, serverTimestamp } from "firebase/firestore";
export default function useStorage(file) {
const [progresspercent, setProgresspercent] = useState(0);
const [error, setError] = useState(null);
const [url, setUrl] = useState(null);
const db = fireStore;
useEffect(() => {
const storageRef = ref(fireStorage, `Images/${file.name}`);
const uploadTask = uploadBytesResumable(storageRef, file);
uploadTask.on("state_changed",
(snapshot) => {
const progress =
(snapshot.bytesTransferred / snapshot.totalBytes) * 100;
setProgresspercent(progress);
},
(error) => {
setError(error);
},
async () => {
const imageUrl = await getDownloadURL(uploadTask.snapshot.ref).then((downloadUrl) => {
addDoc(collection(db, 'Images'),{
url: downloadUrl,
createdAt: serverTimestamp()
})
setUrl(downloadUrl)
});
}
);
},[file]);
return { progresspercent, url, error };
}
这里是上传表单
import React, { useState } from "react";
import ProgressBar from "./ProgressBar";
export default function UploadForm() {
const [file, setFile] = useState(null);
const [error, setError] = useState("");
const allowedType = ["image/png", "image/jpg", "image/jpeg"];
function changeHandler(e) {
let selectedFile = e.target.files[0];
if (selectedFile && allowedType.includes(selectedFile.type)) {
setFile(selectedFile);
setError("");
} else {
setFile(null);
setError("Please select an image file");
}
}
return (
<form>
<label>
<input type="file" onChange={changeHandler} />
<span>+</span>
</label>
<div className="output">
{error && <div className="error">{error}</div>}
{file && <div>{file.name}</div>}
{file && <ProgressBar file={file} setFile={setFile} />}
</div>
</form>
);
}
这是我的useFirestore钩子
import { useState, useEffect } from "react";
import { fireStorage, firestore } from '../firebase-config'
import { ref, getDownloadURL, uploadBytesResumable } from "firebase/storage";
import { collection, addDoc, serverTimestamp } from "firebase/firestore";
export default function useStorage(file) {
const [progresspercent, setProgresspercent] = useState(0);
const [error, setError] = useState(null);
const [url, setUrl] = useState(null);
const db = firestore;
useEffect(() => {
const storageRef = ref(fireStorage, `Images/${file.name}`);
const uploadTask = uploadBytesResumable(storageRef, file);
uploadTask.on("state_changed",
(snapshot) => {
const progress =
(snapshot.bytesTransferred / snapshot.totalBytes) * 100;
setProgresspercent(progress);
},
(error) => {
setError(error);
},
async () => {
const imageUrl = await getDownloadURL(uploadTask.snapshot.ref).then((downloadUrl) => {
addDoc(collection(db, 'Images'),{
url: downloadUrl,
createdAt: serverTimestamp()
})
setUrl(downloadUrl)
});
}
);
},[file]);
return { progresspercent, url, error };
}
1条答案
按热度按时间ecr0jaav1#
我想这是一个有关React18只是一个简单的解决方案<React.StrictMode>从主组件文件中删除或使用条件函数在使用效果