Skip to content

Commit 7113dcc

Browse files
authored
fix: reset the original value when resetField is called #3891 (#3892)
1 parent c096372 commit 7113dcc

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

packages/vee-validate/src/useFieldState.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export function _useFieldValue<TValue = unknown>(
9696
return;
9797
}
9898

99-
form.setFieldInitialValue(unref(path), value);
99+
form.stageInitialValue(unref(path), value, true);
100100
}
101101

102102
const initialValue = computed(resolveInitialValue);

packages/vee-validate/tests/useField.spec.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useField } from '@/vee-validate';
1+
import { useField, useForm } from '@/vee-validate';
22
import { defineComponent, onMounted, ref } from 'vue';
33
import { mountWithHoc, setValue, flushPromises } from './helpers';
44

@@ -187,6 +187,42 @@ describe('useField()', () => {
187187
expect(meta?.textContent).toBe('clean');
188188
});
189189

190+
// #3891
191+
test('dirty flag is false after reset with a new value when a form is present', async () => {
192+
mountWithHoc({
193+
setup() {
194+
useForm();
195+
const { value, meta, resetField } = useField('field', val => (val ? true : REQUIRED_MESSAGE));
196+
197+
return {
198+
value,
199+
meta,
200+
resetField,
201+
};
202+
},
203+
template: `
204+
<input name="field" v-model="value" />
205+
<span id="meta">{{ meta.dirty ? 'dirty' : 'clean' }}</span>
206+
<button @click="resetField({ value: '12' })">Reset</button>
207+
`,
208+
});
209+
210+
const input = document.querySelector('input') as HTMLInputElement;
211+
const meta = document.querySelector('#meta');
212+
213+
await flushPromises();
214+
expect(meta?.textContent).toBe('clean');
215+
216+
setValue(input, '');
217+
await flushPromises();
218+
expect(meta?.textContent).toBe('dirty');
219+
220+
// trigger reset
221+
document.querySelector('button')?.click();
222+
await flushPromises();
223+
expect(meta?.textContent).toBe('clean');
224+
});
225+
190226
describe('has validation modes', () => {
191227
test('silent mode does not generate messages', async () => {
192228
let validateFn!: ReturnType<typeof useField>['validate'];

0 commit comments

Comments
 (0)