У меня есть следующий код:
addLineItem = (formProps: FormikProps<MyEntity>, arrayHelpers: ArrayHelpers) => {
arrayHelpers.push(getNewEntity(formProps.values.date));
reassignLineItemIds(formProps);
};
Проблема, с которой я сталкиваюсь, заключается в том, что reassignLineItemIds
нужны обновленные значения в formProps
, и у меня нет доступа к обновленной версии formProps
после запуска arrayHelpers.push()
.
Одно решение, с которым я столкнулся, заключалось в создании следующего компонента:
interface ConnectedProps {
delay?: number;
onChange: (prevProps: FormikProps<MyEntity>, nextProps: FormikProps<MyEntity>) => void;
}
interface OwnProps extends ConnectedProps {
formik: FormikProps<FormikValues>;
}
class FormChangeHandler extends Component<OwnProps> {
onChange = debounce(this.props.onChange, this.props.delay || 0);
componentDidUpdate(prevProps: OwnProps) {
const { formik } = this.props;
const { isValid } = formik;
const hasChanged = !isEqual(prevProps.formik.values, formik.values);
const shouldCallback = isValid && hasChanged;
if (shouldCallback) {
this.onChange(prevProps.formik as FormikProps<MyEntity>, formik as FormikProps<MyEntity>);
}
}
render() {
return null;
}
}
const connected = connect<ConnectedProps>(FormChangeHandler);
export { connected as FormChangeHandler };
Затем в моем Formik <Form>
включите следующее:
<FormChangeHandler onChange={
(prevProps: FormikProps<MyEntity>, nextProps: FormikProps<MyEntity>) => {
if (getLineItemCount(prevProps.values) !== getLineItemCount(nextProps.values)) {
reassignLineItemIds(nextProps);
}
}} />
Это работает, но оно будет иметь негативное влияние на производительность и кажется просто сумасшедшим обручем, через который можно прыгнуть.