Formik Chakra-ui выберите без использования значения
Я пытаюсь отправить форму с раскрывающимся списком. Проблема в том, что formik не распознает значение из опций, не знаю, почему и как это исправить.
<Formik
initialValues={{ ingredientId:"", }}
onSubmit={async (values, { setErrors }) => {
console.log(values);
}}
>
{({ isSubmitting }) => (
<FormControl name="ingredientId" id="ingredientId">
<FormLabel>Ingredient</FormLabel>
<Select name="ingredientId" id="ingredientId">
{ingredients!.map((ingredient: any) => {
return <option value={ingredient.id} id="ingredientId">
{ingredient.name}
</option>;
})}
</Select>
</FormControl>
...
)}
</Formik>
Несмотря на то, что ингридиентId по-прежнему равен нулю после отправки, есть идеи?
2 ответа
Забавно, но даже спустя 20 с лишним лет этот меня все еще сбивает с толку, когда я тороплюсь. Проще говоря, выбранный вариант не сохраняется как
value
принадлежащий
select
элемент.
Чтобы получить выбранное значение, вам нужно сделать что-то вроде:
const { target } = event;
// note: 'select-multiple' for multi select
if (target.type === 'select-one') {
const selectValue = target.selectedOptions[0].value;
}
https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/selectedOptions
Вам не нужно использовать значение и handleChange. Formik справится с этим. Вы можете удалить эти строки
const [value, setValue] = React.useState("");
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setValue(event.target.value);
};
Попробуй использовать
<Field>
из формика и
{field.onChange}
или же
{form.handleChange}
. Пример:
<Formik
initialValues={{ ingredientId: '' }}
onSubmit={(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
}}>
{(props) => (
<Form>
<Field>
{({ field, form }: FieldProps) => (
<FormControl name="ingredientId" id="ingredientId">
<FormLabel>Ingredient</FormLabel>
<Select
name="ingredientId"
id="ingredientId"
onChange={field.onChange} // or {form.handleChange}
value={value}>
{ingredients!.map((ingredient: any) => (
<option
key={ingredient.id}
value={ingredient.id}
id="ingredientId">
{ingredient.name}
</option>
))}
</Select>
</FormControl>
)}
</Field>
<Button isLoading={props.isSubmitting} type="submit">
Submit
</Button>
</Form>
)}
</Formik>