我可以将 FieldArray 与 useFormik 挂钩一起使用吗?

Can I use FieldArray alongside useFormik hook?

在我的表单组件中,我想将 FieldArray 与 useFormik 挂钩一起使用。当我尝试这样做时,出现 TypeError: _this$props2$formik is undefined 错误。

我应该切换到 class 组件还是我可以以某种方式将 formik 注入 FieldArray?或者有什么办法吗?

const MyForm = ({openPanel}) => {
    const intl = useIntl();

    const formData = useSelector(state => state.form[Forms.SOURCE_EDIT]);

    const formik = useFormik({
        initialValues: {
            style: formData ? formData.style : '',
            layers: formData ? formData.layers : [],
        },
        validationSchema: createValidationSchema(),
        onSubmit: async values => {
            // ...
        },
    });

    const {
        values,
        errors,
        touched,
        handleSubmit,
        isSubmitting,
        handleChange,
        handleBlur,
    } = formik;

    return (
        <div className={'center-flex'}>
            <form onSubmit={handleSubmit}>
                {/* ... */}
                <FieldArray
                    name={'layers'}
                    render={arrayHelpers => (
                        <div>
                            {values.layers.map((layer, index) => (
                                <div key={index}>{layer.name}</div>
                            ))}
                        </div>
                    )}
                />
                <Button
                    large
                    intent={Intent.PRIMARY}
                    fill
                    loading={isSubmitting}
                    disabled={isSubmitting}
                    type={'submit'}>
                    {intl.formatMessage(messages.next)}
                </Button>
            </form>
        </div>
    );
};

提前致谢

如 formik 文档中所述:**请注意 <Field><FastField><ErrorMessage>connect()<FieldArray> 不适用于useFormik() 因为它们都需要 React 上下文。 您必须将表单包装在 Formik 组件中,以便在它们内部使用 formik 上下文时使用这些组件。供参考:https://jaredpalmer.com/formik/docs/api/useFormik

可能有点晚了,但是您可以使用 FormikProvider,它将 useFormik 值作为 prop。

const formik = useFormik()
....
<FormikProvider value={formik}>
  <FieldArray name="" render={() => (...) />
</FormikProvider>

您也可以使用

https://ramdajs.com/docs/#symmetricDifference or https://lodash.com/docs/4.17.15#xor

const { values, handleSubmit, handleChange, handleBlur, setFieldValue, errors } = useFormik({

const handleBerthTypeChange = React.useCallback<NonNullable<CheckboxProps["onChange"]>>(
  (e) => {
    setFieldValue("berthTypes", symmetricDifference(values.berthTypes ?? [], [e.target.name]));
  },
  [values, setFieldValue],
);


<Checkbox
  checked={values.berthTypes?.includes(code) ?? false}
  onChange={handleBerthTypeChange}
  name={code}
/>