React Hook Form требуется динамическая форма

Я пытаюсь создать форму с двумя полями, используя форму реагирования, где требуемое значение текстового поля зависит от значения раскрывающегося списка выбора.

Вот мой код:

  const { handleSubmit, control, errors } = useForm();

  const [isPickupPoint, togglePickupPoint] = useState(false);

  const handleDestinationTypeChange: EventFunction = ([selected]) => {
    togglePickupPoint(selected.value === "PICKUP_POINT");
    return selected;
  };

            <Grid item xs={6}>
              <InputLabel>Destination type</InputLabel>
              <Controller
                as={Select}
                name="destinationType"
                control={control}
                options={[
                  { label: "Pickup point", value: "PICKUP_POINT" },
                  { label: "Shop", value: "SHOP" },
                ]}
                rules={{ required: true }}
                onChange={handleDestinationTypeChange}
              />
              {errors.destinationType && (
                <ErrorLabel>This field is required</ErrorLabel>
              )}
            </Grid>
            <Grid item xs={6}>
              <Controller
                as={
                  <TextField
                    label="Pickup Point ID"
                    fullWidth={true}
                    disabled={!isPickupPoint}
                  />
                }
                control={control}
                name="pickupPointId"
                rules={{ required: isPickupPoint }}
              />
              {errors.pickupPointId && (
                <ErrorLabel>This field is required</ErrorLabel>
              )}
            </Grid>
            <Grid item xs={12}>
              <Button
                onClick={onSubmit}
                variant={"contained"}
                color={"primary"}
                type="submit"
              >
                Save
              </Button>
            </Grid>

Флаг isPickupPoint изменяется правильно, потому что опора disabled для textfield работает нормально. Текстовое поле активно только при выборе опции PICKUP_POINT. Но требуемый реквизит не работает, он всегда ложный. Когда я пытаюсь отправить форму, когда она пуста, появляется метка ошибки destinationType, но когда я пытаюсь отправить форму с параметром PICKUP_POINT и пустым полем pickupPointId, она проходит без ошибок.

Как я могу заставить работать эту динамическую опору?


person Matt    schedule 25.07.2020    source источник


Ответы (1)


Основываясь на приведенном здесь коде, похоже, что isPickUpPoint работает должным образом, поскольку работает для отключения. Поскольку вы используете одно и то же свойство для required, оно должно пройти. Я подозреваю, что ошибка может заключаться в вашем Controller компоненте. Я бы посмотрел туда и убедился, что это то, что вы ожидали.

Также для отключенного состояния установлено значение !isPickUpPoint, поэтому оно будет срабатывать, когда оно ложно.

Для обязательного условия - isPickUpPoint, поэтому оно сработает, когда оно истинно.

Это также немного сбивает с толку, поскольку похоже, что это тот же вход.

person Pradeep Dayaram    schedule 25.07.2020
comment
Компонент Controller на самом деле является компонентом формы реакции-перехватчика, поэтому, боюсь, я мало что могу там сделать. Если я чего-то не вижу? - person Matt; 25.07.2020
comment
Хм, а как насчет несоответствия между отключенным и обязательным? Это намеренно? - person Pradeep Dayaram; 25.07.2020
comment
Да, если выбрана опция PICKUP_POINT, поле должно быть включено (следовательно! IsPickupPoint - поле должно быть отключено, если PICKUP_POINT не выбран). И когда поле включено, оно должно быть обязательным. - person Matt; 26.07.2020