Я совсем новичок, поэтому постараюсь объяснить как можно проще. У меня есть простая форма, и я пытаюсь обновить поле. Для обновления я установил следующее:
Моя проблема в том, что если я изменю значение одного поля, например, «имя», и отправлю форму, «имя» будет успешно обновлено в firebase, однако другое поле в моем случае «описание» также будет обновлено с пустым значением. То же самое происходит, если «описание» изменено, а имя нет.
export default CategoryUpdate
const CategoryUpdate = () => {
const [name, setName] = useState("");
const [description, setDescription] = useState("");
const params = useParams(); // get category id from url
const [data, setData] = useState([]);
useEffect(() => {
const fetchData = async () => {
const docRef = doc(db, "category", params.categoryId)
const docSnap = await getDoc(docRef)
if (docSnap.exists()){
setData(docSnap.data())
}
};
fetchData();
},[params.categoryId]);
// Updating category in Firebase
const saveDetails = async () => {
const updateSchool = {
name: name,
description: description,
};
try {
const schoolRef = doc(db, "category", data.id)
await updateDoc(schoolRef, updateSchool);
} catch (error) {
console.info(error);
}
}
return (
<form>
<input
type = "text"
required
defaultValue = {data.name || ''}
placeholder = "Set a title"
onChange = {(e) => setName(e.target.value)}
/>
<input
type = "text"
required
defaultValue = {data.description || ''}
placeholder = "Set a title"
onChange = {(e) => setDescription(e.target.value)}
/>
<div className='flex items-center w-full'>
<button type = "button"
onClick = {saveDetails}
>
Edit Category
</button>
</div>
</form>
)
}
export default CategoryUpdate
Я попытался обновить поле в форме, и я ожидал, что после обновления обновленное поле будет обновлено, а остальные поля сохранят исходные значения до обновления.
использовать переменные состояния в значении по умолчанию
<input
type = "text"
required
defaultValue = {name || ''}
placeholder = "Set a title"
onChange = {(e) => setName(e.target.value)}
/>
<input
type = "text"
required
defaultValue = {description || ''}
placeholder = "Set a description"
onChange = {(e) => setDescription(e.target.value)}
/>
И обновить состояние в useEffect
useEffect(() => {
if (data){
setDescription(data.description)
setName(data.name)
}
}, [data])
см. обновленный
Это решило мою проблему. Спасибо за быстрый ответ.
Спасибо за комментарий. Но это не решило мою проблему. Это была моя вина из-за копирования / вставки кода. Извините за введение в заблуждение.