#javascript #reactjs
#javascript #reactjs
Вопрос:
Я ценю любые ответы и предложения. У меня есть компонент react, который загружает форму для редактирования продукта. Когда компонент смонтирован, он получит реквизиты от другой функции, и я использую эти значения внутри реквизита в качестве значения по умолчанию для полей ввода в форме. У меня также есть элемент ввода, который принимает загрузку файла. Когда файл выбран, компонент, похоже, обновляется и устанавливает для других полей ввода значения по умолчанию. Вот мой компонент:
<form onSubmit={handleSubmit}>
<div className="form-row">
<div className="col-md-4 mt-md-2">
<input
type="text"
className="form-control"
name="name"
placeholder="Name"
defaultValue={product!.name}
ref={register({
required: true,
pattern: /^[a-zA-Z ]*$/,
})}
/>
</div>
<div className="col-md-4 mt-2 mt-md-2">
<input
type="text"
className="form-control"
name="qty"
placeholder="Quantity"
defaultValue={product!.qty}
ref={register({ required: true, pattern: /^[0-9] $/ })}
/>
</div>
</div>
<div className="form-row">
<div className="col-md-4 mt-2 mt-md-2">
<div className="input-group">
<div className="custom-file">
<input
type="file"
className="custom-file-input"
name="posImg"
id="img"
title="Add image to product if it is a menu item"
onChange={handleImg}
/>
<label
className="custom-file-label"
htmlFor="img"
aria-describedby="inputGroupFileAddon02"
>
{fileLabelState}
</label>
</div>
</div>
</div>
</div>
<div className="d-flex justify-content-end mt-2">
<button
type="submit"
className="btn zaad justify-content-end"
title="Submit product edit"
>
Update
</button>
</div>
</form>
Проблема в том, что когда я выбираю файл и нажимаю «Выбрать», все остальные поля ввода сбрасываются до значений по умолчанию. Вот моя функция handleImg:
const handleImg = (e: any) => {
e.preventDefault();
const file = e.target.files[0];
setFileLabelState(e.target.files[0].name);
setFile(file);
};
Я пытался работать с e.preventDefault(), но пока у меня не было никаких шансов. Есть предложения о том, как я могу это сделать?
Еще раз спасибо.
РЕДАКТИРОВАТЬ: я исправил обработчик формы, и теперь вот моя функция handleSubmit:
const handleSubmit = (event: any) => {
event.preventDefault();
event.stopPropagation();
let editedProd = new FormData();
let isMenu: string = event.menuItemOption === "yes" ? "true" : "false";
editedProd.append("name", event.name);
editedProd.append("qty", event.qty);
editedProd.append("img", file);};
Комментарии:
1. Иногда вам может потребоваться также
stopPropagation
для объекта event.2. Что делает SetFile (файл);?
3. @DrewReese Я пробовал это раньше, и я попробовал это снова. Проблема по-прежнему сохраняется
4. @mplungjan SetFile (файл) просто добавляет загруженный файл в состояние компонента. Позже я отправлю это на серверную часть
5. напишите свою функцию
e.preventDefault()
вhandleSubmit
, прямо сейчас вы написали это вhandleImg
Ответ №1:
const handleSubmit = event => {
event.preventDefault();
let editedProd = new FormData();
let isMenu: string = event.menuItemOption === "yes" ? "true" : "false";
editedProd.append("name", event.name);
editedProd.append("qty", event.qty);
editedProd.append("img", file);};
}
попробуйте этот ответ примечание здесь я меняю (event: any)
на event
. это рабочий код из моего проекта