Skip to content

Commit 6a1dc9b

Browse files
committed
fix: component blur event and respect model update config closes #4346
1 parent 510a7a9 commit 6a1dc9b

File tree

4 files changed

+16
-9
lines changed

4 files changed

+16
-9
lines changed

.changeset/brown-planes-shave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'vee-validate': patch
3+
---
4+
5+
fix: component blur event and respect model update config closes #4346

packages/vee-validate/src/useForm.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -872,11 +872,8 @@ export function useForm<
872872
}
873873

874874
function onUpdateModelValue(value: TValue) {
875-
setFieldValue(pathState.path as Path<TValues>, value as PathValue<TValues, TPath>);
876875
const validateOnModelUpdate = evalConfig().validateOnModelUpdate ?? getConfig().validateOnModelUpdate;
877-
if (validateOnModelUpdate) {
878-
validateField(pathState.path as Path<TValues>);
879-
}
876+
setFieldValue(pathState.path as Path<TValues>, value as PathValue<TValues, TPath>, validateOnModelUpdate);
880877
}
881878

882879
const props = computed(() => {
@@ -894,13 +891,13 @@ export function useForm<
894891

895892
const model = config?.model || 'modelValue';
896893
const base = {
894+
onBlur,
897895
[model]: pathState.value,
898896
[`onUpdate:${model}`]: onUpdateModelValue,
899897
};
900898

901899
if (config?.mapProps) {
902900
return {
903-
onBlur,
904901
...base,
905902
...config.mapProps(omit(pathState, PRIVATE_PATH_STATE_KEYS)),
906903
} as BaseComponentBinds<TValue> & TExtras;

packages/vee-validate/tests/helpers/ModelComp.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ export const ModelComp = {
22
props: ['modelValue', 'name', 'test'],
33
emits: ['blur', 'update:modelValue'],
44
inheritAttrs: false,
5-
template: `<input type="text" :name="name" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" @blur="$emit('blur')">
5+
template: `<input type="text" :name="name" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" @blur="$emit('blur');console.log(modelValue, '____' + modelValue + '____' )">
66
<div v-if="test">{{ test }}</div>`,
77
};
88

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ describe('useForm()', () => {
840840
}),
841841
});
842842

843-
const field = defineComponentBinds('name', { validateOnModelUpdate: true });
843+
const field = defineComponentBinds('name', { validateOnModelUpdate: false });
844844

845845
return { field, values, errors };
846846
},
@@ -854,10 +854,15 @@ describe('useForm()', () => {
854854
await flushPromises();
855855
const errorEl = document.getElementById('errors');
856856
const valuesEl = document.getElementById('values');
857-
setValue(document.querySelector('input') as any, '');
857+
const input = document.querySelector('input') as HTMLInputElement;
858+
setValue(input, '');
859+
await flushPromises();
860+
expect(errorEl?.textContent).toBe('');
861+
dispatchEvent(input, 'blur');
858862
await flushPromises();
859863
expect(errorEl?.textContent).toBe('name is a required field');
860-
setValue(document.querySelector('input') as any, '123');
864+
setValue(input, '123');
865+
dispatchEvent(input, 'blur');
861866
await flushPromises();
862867
expect(errorEl?.textContent).toBe('');
863868
expect(valuesEl?.textContent).toBe('123');

0 commit comments

Comments
 (0)