diff --git a/src/__tests__/useForm/reset.test.tsx b/src/__tests__/useForm/reset.test.tsx index 53ad4efa5e5..834e89fa51c 100644 --- a/src/__tests__/useForm/reset.test.tsx +++ b/src/__tests__/useForm/reset.test.tsx @@ -9,7 +9,12 @@ import { import { act, renderHook } from '@testing-library/react-hooks'; import { Controller } from '../../controller'; -import { Control, UseFormRegister, UseFormReturn } from '../../types'; +import { + Control, + UseFormRegister, + UseFormReset, + UseFormReturn, +} from '../../types'; import { useController } from '../../useController'; import { useFieldArray } from '../../useFieldArray'; import { useForm } from '../../useForm'; @@ -1195,6 +1200,47 @@ describe('reset', () => { ).toEqual('changed2'); }); + it('should allow reset at child level before useForm mounted', () => { + type FormValues = { + firstName: string; + }; + + const NestChild = ({ reset }: { reset: UseFormReset }) => { + React.useEffect(() => { + reset({ + firstName: 'test', + }); + }, [reset]); + + return null; + }; + + const Child = ({ reset }: { reset: UseFormReset }) => { + return ; + }; + + function App() { + const { register, reset, handleSubmit } = useForm({ + defaultValues: { + firstName: '', + }, + }); + + return ( +
{})}> + + + + ); + } + + render(); + + expect((screen.getByRole('textbox') as HTMLInputElement).value).toEqual( + 'test', + ); + }); + it('should reset field array async', () => { let tempFields: unknown[] = []; diff --git a/src/logic/createFormControl.ts b/src/logic/createFormControl.ts index 8b5f08051b9..c2bb5ebd768 100644 --- a/src/logic/createFormControl.ts +++ b/src/logic/createFormControl.ts @@ -91,6 +91,7 @@ export function createFormControl< TContext = any, >( props: UseFormProps = {}, + flushRootRender: () => void, ): Omit, 'formState'> { let _options = { ...defaultOptions, @@ -641,6 +642,7 @@ export function createFormControl< _subjects.watch.next({ name, }); + !_stateFlags.mount && flushRootRender(); }; const onChange: ChangeHandler = async (event) => { @@ -1173,6 +1175,8 @@ export function createFormControl< focus: '', }; + !_stateFlags.mount && flushRootRender(); + _stateFlags.mount = !_proxyFormState.isValid || !!keepStateOptions.keepIsValid; diff --git a/src/useForm.ts b/src/useForm.ts index 1634dcc460b..fd61936e1b6 100644 --- a/src/useForm.ts +++ b/src/useForm.ts @@ -60,7 +60,9 @@ export function useForm< if (!_formControl.current) { _formControl.current = { - ...createFormControl(props), + ...createFormControl(props, () => + updateFormState((formState) => ({ ...formState })), + ), formState, }; }