#reactjs #formik #formik-material-ui
Вопрос:
Я пытаюсь создать изображение, загруженное в мою форму. Проблема в том, что я пытаюсь изменить значение на фактический загруженный файл. Я пытаюсь использовать значение setFieldValue, но оно говорит, что оно не определено. Ниже приведен код. Есть идеи, почему он не определен? Я думал, что он поставляется с Формиком.
import { Formik } from 'formik';
const AddProduct = (props) => {
return (
<Formik
initialValues={{
serviceImage: null
}}
onSubmit={(values) => {
console.log(values);
}}
>
{({
errors,
handleBlur,
handleChange,
handleSubmit,
setFieldValue,
isSubmitting,
touched,
values,
formProps
}) => (
<form onSubmit={handleSubmit}>
<TextField
error={Boolean(touched.serviceName amp;amp; errors.serviceName)}
fullWidth
helperText={touched.serviceName amp;amp; errors.serviceName}
label="Service name"
margin="normal"
name="serviceName"
onBlur={handleBlur}
onChange={handleChange}
value={values.serviceName}
/>
<Button>
<input
id="file"
name="serviceImage"
value={values.serviceImage}
type="file"
onChange={(event) => formProps.setFieldValue('serviceImage', event.target)
}
/>
Add an Image
</Button>
<Button
type="submit" >
Post this service on the Events Platform
</Button>
</form>
)}
</Formik>
);
};
Комментарии:
1. вы уверены, что
fromProps
это esist? почему бы вам не использовать просто значение setFieldvalue из вашего примера?2. Это то, что я получаю, если использую его без fromProps. «Неперехваченное исключение DOMException: Не удалось установить свойство «значение» для элемента «HTMLInputElement»: Этот элемент ввода принимает имя файла, которое может быть задано только программно в виде пустой строки.»
Ответ №1:
Вы уже объявили setFieldValue
в своей функции обратного вызова formik
Так что измените его на:
<input
id="file"
name="serviceImage"
value={values.serviceImage}
type="file"
onChange={event => setFieldValue('serviceImage', event.currentTarget.files[0])}
/>;
Комментарии:
1. Если я использую его таким образом, я получаю эту ошибку. Неперехваченное исключение DOMException: Не удалось установить свойство «значение» в «HTMLInputElement»: Этот элемент ввода принимает имя файла, которое может быть задано только программно в виде пустой строки.
2. Я удалил «значение={values.serviceImage}», и теперь оно работает. Спасибо!
3. Это здорово! Вы можете принять мой ответ, если это полезно и если у других людей есть рекомендации.