2

我正在尝试提交带有下拉列表的表单。问题是 formik 无法识别选项的价值,不知道为什么或如何解决它。

const [value, setValue] = React.useState("");
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
  setValue(event.target.value);
};
<Formik
    initialValues={{ ingredientId:"", }}
    onSubmit={async (values, { setErrors }) => {
        console.log(values);
    }}
>
    {({ isSubmitting }) => (
        <FormControl name="ingredientId" id="ingredientId">
            <FormLabel>Ingredient</FormLabel>
            <Select 
               name="ingredientId" 
               id="ingredientId" 
               onChange={handleChange} 
               value={value}
             >
                {ingredients!.map((ingredient: any) => {
                    return <option value={ingredient.id} id="ingredientId"> 
                        {ingredient.name}
                    </option>;
                })}
            </Select>
        </FormControl>
        ...
    )}
</Formik>

虽然提交后的成分 ID 仍然为空,但有什么想法吗?

4

2 回答 2

1

这很有趣,但即使在 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

于 2021-09-17T17:48:02.237 回答
0

您不需要使用 value 和 handleChange。Formik 会处理这个问题。您可以删除此行

const [value, setValue] = React.useState("");
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
  setValue(event.target.value);
};

尝试使用<Field>from formik 和{field.onChange}or {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

于 2022-01-03T07:35:39.113 回答