React H(ookF)orm.
This package will provide formik
-like features with React Hook Support.
It uses context internally, which means as long as it is rendered within Horm
, you could get access to the form by using hooks instead of passing any reference down deeply to the field component. It will be very handy especially for those complex FormInput which is defined outside of the main form.
yarn add react-horm
import { Horm, useField, useForm, useCountDown } from 'react-horm';
// render form as children
<Horm>
<FormComponent ></FormComponent>
</Horm>
// render form as prop
<Horm render={FormComponent} ></Horm>
Horm props:
required
]: Initial form values, it MUST contains all the fields.onSubmit [required
]: It will be called in useForm.htmlProps.onSubmit
if the form is valid.
initialValid [optional
]: Initial value of useForm.hormBag.isValid
optional
]: Default is true. Whether validation should be run in case of blur and focus.optional
]: Default is true. Whether validation should be run in case of value change.optional
]: Default is false. If set as true, the form will be reset in case of new initialValues
passed in.optional
]: Yup schema. See example below.optional
]: Validation function which takes form values as parameter and return object contains field errors. See example below.
const validationSchema = Yup.object().shape({
email: Yup.string()
.email()
.required(),
password: Yup.string()
.min(6)
.required(),
});
const validationFn: ValidationFn = (values) => {
let errors: FormState<string[]> = { email: [], password: [] };
if (values.email.length === 0) {
errors.email.push('Email cannot be empty');
}
if (values.password.length === 0) {
errors.password.push('Password cannot be empty');
}
return errors;
};
// Example
const loginForm = useForm();
<LoginForm {...loginForm.htmlProps} ></LoginForm>;
// Example
const emailField = useField('email');
<input {...emailField.htmlProps} />;
It is normally used to limit users’ interactions with a particular function within given period (e.g sending SMS OTP code).
// Example
const [val, restart] = useCountDown(120);
val
will be 0 initially, once restart
is called, val
will be running from the starting value you pass to the hook (120 seconds in the example above) and stops at 0. The restart
function could be called multiple times, and the val
will be reset to the starting value and counting down again, regardless of current value.