#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.