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>

См. https://formik.org/docs/api/formik

Другие вопросы по тегам