Formik и React-Select — при сбое отправки формы выпадающий список выбора не поддерживает правильное значение

#reactjs #react-select #formik

#reactjs #реагировать-выбрать #formik

Вопрос:

Я использую React , Formik , и react-select . У меня возникли проблемы с полем выбора выпадающего списка для страны.

Перед отправкой формы я вижу, что форма имеет как значение, так и метку:

 console.log(this.props.values.billing_information_attributes.address_attributes.country )
 

возвращает это {value: "United States", label: "United States"}

После отправки формы и ответа на запрос post с ошибкой (это желаемый сбой для целей тестирования) все остальные формы сохраняют свои значения, за исключением этого выпадающего списка. Теперь то же console.log самое возвращает только "United States"

Для работы выпадающего списка необходимо предоставить объект в формате, указанном ранее {value: "United States", label: "United States"} , или выпадающий список отображается пустым. Очевидно, я мог бы использовать обходной путь и снова установить значение поля, используя setFieldValue , но я чувствую, что мне чего-то не хватает в отношении жизненного цикла Formik. Еще одна важная вещь, которую следует упомянуть, это то, что перед отправкой запроса post я изменяю данные, которые отправляю на сервер, и отправляю только значение страны, а не все значение и объект метки, например:

 newParams["billing_information_attributes"]["address_attributes"]["country"] =
params["billing_information_attributes"]["address_attributes"]["country"].value
 

Вот мой запрос post:

 handleSubmit = (params, actions) => {
    Stripe.card.createToken(
      {
        number: params.card_number,
        cvc: params.security_id,
        exp_month: params.exp_month,
        exp_year: params.exp_year,
        address_zip: params.billing_information_attributes.address_attributes.postal_code
      },
      (status, response) => {
        params.stripe_card_token = response.id
        axios
          .request("/order/complete", {
            method: "patch",
            data: {
              order: modifiedParams(params, "checkoutForm"),
              authenticity_token: this.props.authenticity_token,
              agree_to_terms: params.agree_to_terms,
              save_new_card: params.save_new_card,
              saved_cards: params.saved_cards.value
            }
          })
          .then(({ data }) => {
            if (data.success) {
              actions.resetForm()
              actions.setStatus({ message: data.message })
              window.location.replace("/order/"   data.order_id)
            } else {
              actions.setErrors({ server: data.errors })
              actions.setStatus({ message: data.message})
              console.log(data)
            }
            actions.setSubmitting(false)
            document.querySelector(".flashMsg").scrollIntoView({ behavior: "smooth" })
          })
          .catch(error => {
            console.log(error)
            actions.setSubmitting(false)
            actions.setErrors({ server: ["Cannot submit form at the moment. Please try again."] })
            document.querySelector("body").scrollIntoView({ behavior: "smooth" })
          })
      }
    )
  }
 

Кто-нибудь может помочь выяснить, почему значение this.props.values.billing_information_attributes.address_attributes.country изменяется с {value: "United States", label: "United States"} на просто United States после отправки, а запрос post отвечает сбоем? Спасибо!

Комментарии:

1. Не могли бы вы предоставить минимальный пример кода, показывающий вашу проблему с использованием такой службы, как CodeSandbox ?

2. Ваши вопросы очень трудно понять, Can anyone help figure out why the values of this field change after submit? я не могу понять, как они меняются, пожалуйста, объясните лучше

3. @Vencovsky Я отредактировал свой вопрос с лучшим объяснением. Посмотрите, имеет ли это смысл для вас сейчас. Мне кто-то ответил на странице formik проблем github.com/jaredpalmer/formik/issues/1452 подтверждение того, что это тоже происходило с ним. Я думаю, что это, должно быть, ошибка formik .