React Formik с автозаполнением Google

#reactjs #formik

#reactjs #formik

Вопрос:

Я использую formik для создания формы и импорта компонента, который позволяет мне использовать автозаполнение Google.

 const SearchLocationInput = (props) => {
  const [chosenLocation, setChosenLocation] = useState(null);
  const autoCompleteRef = useRef(null);

  const dispatch = useDispatch();

  const handleOnChange = (value) => {
    console.log(value);
    console.log(props.fieldName);
    props.formik.setFieldValue(props.fieldName, value);
  };

  useEffect(() => {
    chosenLocation amp;amp; dispatch(auth.updateBusinessLocation(chosenLocation));
  }, [chosenLocation]);

  useEffect(() => {
    loadScript(
      `https://maps.googleapis.com/maps/api/js?key=${process.env.NEXT_PUBLIC_GOOGLE_API_KEY}amp;libraries=places`,
      () => handleScriptLoad(handleOnChange, setChosenLocation, autoCompleteRef)
    );
  }, []);

  return (
    <div className="search-location-input">
      <FloatInput
        ignoreError
        type="text"
        name={props.fieldName}
        ref={autoCompleteRef}
        position={props.position}
        label={props.label}
        onChange={(e) => handleOnChange(e.target.value)}
      />
    </div>
  );
};
 

Обычный ввод в поле сохраняет текст в handleOnChange. Значение и имя поля в порядке и регистрируются как консоль.

Я передаю эту функцию в handleScriptLoad, которая по сути возвращает результат поиска. Работает нормально. Код для этого приведен ниже.

 const handlePlaceSelect = async (handleOnChange, setChosenLocation) => {
  const addressObject = autoComplete.getPlace();
  const query = addressObject.formatted_address;
  handleOnChange(query);
  setChosenLocation(addressObject);
};
 

Когда handleOnChange запускается из этой функции, я получаю результаты журнала консоли, как и ожидалось. Я также регистрировал значения formik после установки, и значение есть.

Итак, проблема: если я нахожу результат автозаполнения, стрелку вниз и нажимаю enter, значение ввода формы обновляется, все работает отлично. НО, если я решу щелкнуть результат, форма сбрасывается.

Я думаю, что вся форма повторно отображается по щелчку / внешнему щелчку. Итак, кто-нибудь знает, как обнаружить и переопределить конкретное поле?

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

1. Попробуйте заполнить значение в onlick(). Разве это не работает?

2. Я думаю, что я сузил его до события щелчка по месту, результаты которого приводят к повторному отображению всей формы, поскольку я понимаю, что я также теряю значения из других частей формы. Таким образом, щелчок вызывает повторный просмотр всей родительской формы (стрелка и ввод работают нормально, как упоминалось). Значения формы установлены нормально, так как я проверил консольный журнал значений перед выходом из функции. Но затем повторный рендеринг теряет все значения

3. Я переключился на использование локального состояния для установки значения, затем при запуске я обновляю значение формы. Проблема в том, что выбор результата не рассматривается как событие onBlur. Поэтому мне приходится снова и снова нажимать, чтобы установить значение formik.