Skip to content

Commit 6025100

Browse files
🐞 fix #12988 sync two defaultValues after reset with new defaultValues (#12990)
* fix: add defaultValues in _reset method to update defaultValues * Test: add a test to check that both formState.defaultValues and useFormState().defaultValues are the same * fix: remove condition for defaultValues value
1 parent 323cd41 commit 6025100

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

src/__tests__/useForm.test.tsx

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ import type {
2626
import isFunction from '../utils/isFunction';
2727
import noop from '../utils/noop';
2828
import sleep from '../utils/sleep';
29-
import { Controller, createFormControl, useFieldArray, useForm } from '../';
29+
import {
30+
Controller,
31+
createFormControl,
32+
useFieldArray,
33+
useForm,
34+
useFormState,
35+
} from '../';
3036

3137
jest.useFakeTimers();
3238

@@ -2724,4 +2730,49 @@ describe('useForm', () => {
27242730
expect(input.value).toBe('abc');
27252731
});
27262732
});
2733+
2734+
describe('When using defaultValues', () => {
2735+
function App() {
2736+
type FormValues = {
2737+
firstName: string;
2738+
};
2739+
2740+
const [defaults, setDefaults] = React.useState<FormValues>({
2741+
firstName: '1',
2742+
});
2743+
2744+
const { control, formState, reset, register } = useForm<FormValues>({
2745+
defaultValues: defaults,
2746+
});
2747+
2748+
const { defaultValues: stateDefaults } = useFormState({ control });
2749+
2750+
const handleClick = () => {
2751+
const next = { firstName: String(Number(defaults.firstName) + 1) };
2752+
setDefaults(next);
2753+
reset(next);
2754+
};
2755+
2756+
return (
2757+
<div>
2758+
<input {...register('firstName')} />
2759+
<button onClick={handleClick}>reset</button>
2760+
<span data-testid="react">{defaults.firstName}</span>
2761+
<span data-testid="form">{formState.defaultValues?.firstName}</span>
2762+
<span data-testid="state">{stateDefaults?.firstName}</span>
2763+
</div>
2764+
);
2765+
}
2766+
it('formState.defaultValues and useFormState().defaultValues should be equal after reset', () => {
2767+
render(<App />);
2768+
2769+
fireEvent.click(screen.getByText('reset'));
2770+
fireEvent.click(screen.getByText('reset'));
2771+
fireEvent.click(screen.getByText('reset'));
2772+
2773+
const reactValue = screen.getByTestId('react').textContent;
2774+
expect(screen.getByTestId('form').textContent).toBe(reactValue);
2775+
expect(screen.getByTestId('state').textContent).toBe(reactValue);
2776+
});
2777+
});
27272778
});

src/logic/createFormControl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,7 @@ export function createFormControl<
14381438
? _formState.isSubmitSuccessful
14391439
: false,
14401440
isSubmitting: false,
1441+
defaultValues: _defaultValues as FormState<TFieldValues>['defaultValues'],
14411442
});
14421443
};
14431444

0 commit comments

Comments
 (0)