diff --git a/.changeset/chilly-owls-wonder.md b/.changeset/chilly-owls-wonder.md new file mode 100644 index 000000000..1afeb806f --- /dev/null +++ b/.changeset/chilly-owls-wonder.md @@ -0,0 +1,5 @@ +--- +'vee-validate': patch +--- + +fix: reset form should merge values closes #4320 diff --git a/packages/vee-validate/src/useForm.ts b/packages/vee-validate/src/useForm.ts index bda87359b..395b0743b 100644 --- a/packages/vee-validate/src/useForm.ts +++ b/packages/vee-validate/src/useForm.ts @@ -1050,8 +1050,8 @@ function useFormInitialValues( const originalInitialValues = ref>(deepCopy(values)) as Ref>; function setInitialValues(values: PartialDeep, updateFields = false) { - initialValues.value = deepCopy(values); - originalInitialValues.value = deepCopy(values); + initialValues.value = merge(deepCopy(initialValues.value) || {}, deepCopy(values)); + originalInitialValues.value = merge(deepCopy(originalInitialValues.value) || {}, deepCopy(values)); if (!updateFields) { return; diff --git a/packages/vee-validate/tests/useForm.spec.ts b/packages/vee-validate/tests/useForm.spec.ts index be9578e16..ab77c777d 100644 --- a/packages/vee-validate/tests/useForm.spec.ts +++ b/packages/vee-validate/tests/useForm.spec.ts @@ -719,6 +719,33 @@ describe('useForm()', () => { expect(meta.validated).toBe(false); }); + // #4320 + test('Initial values are merged with previous values to ensure meta.dirty is stable', async () => { + let meta!: Ref>; + + mountWithHoc({ + setup() { + const { resetForm, meta: fm } = useForm(); + useField('name'); + useField('email'); + + meta = fm; + + onMounted(() => { + resetForm({ values: { name: 'test' } }); + }); + + return {}; + }, + template: ` +
+ `, + }); + + await flushPromises(); + expect(meta.value.dirty).toBe(false); + }); + // #3991 test('initial value should not be mutable if nested field model is used', async () => { let model!: Ref<{ name: string }>;