Skip to content

Instantly share code, notes, and snippets.

@AlonMiz
Last active May 7, 2024 21:38
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save AlonMiz/e583946d3978de691ed53cece972e1a1 to your computer and use it in GitHub Desktop.
Save AlonMiz/e583946d3978de691ed53cece972e1a1 to your computer and use it in GitHub Desktop.
import { useCallback, useEffect, useRef } from 'react';
import { debounce } from 'lodash';
import { FormikValues } from 'formik';
import { FormikConfig } from 'formik/dist/types';
export function useDebouncedValidate<T extends FormikValues>({
values,
validate,
debounceTime = 200,
}: {
values: T;
validate: FormikConfig<T>['validate'];
debounceTime?: number;
}) {
const debouncedFunction = useRef(
debounce((validateFunc: FormikConfig<T>['validate'], data: T) => {
return validateFunc(data);
}, debounceTime),
);
const debounceValidate = useCallback(data => {
return debouncedFunction.current(validate, data);
}, []);
useEffect(() => {
debounceValidate(values);
}, [values]);
useEffect(() => {
return () => {
debouncedFunction.current.cancel();
};
}, []);
}
// usage
import React from 'react';
import { FormikProvider, useFormik, Field } from 'formik';
import * as Yup from 'yup';
const initialValues = { name: '' };
const formSchema = Yup.object().shape({
name: Yup.string().required('Required'),
});
const SimpleForm = () => {
const formMethods = useFormik({
initialValues,
validationSchema: formSchema,
validateOnChange: false,
onSubmit: async () => {
console.log('Form submitted');
},
});
useDebouncedValidate({
validate: values => {
console.log('validating',values);
formMethods.validateForm(values);
},
debounceTime: 200,
values: formMethods.values,
});
return (
<FormikProvider value={formMethods}>
<Field label={'name'} name={'name'} />
</FormikProvider>
);
};
@TangoPJ
Copy link

TangoPJ commented May 30, 2023

@AlonMiz Hello. I'm losing a focus from my input on every enter a character in it. How to solve the problem?
Thank you

@AlonMiz
Copy link
Author

AlonMiz commented Jun 2, 2023

try simply using <Field name={'name'} />
working for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment