Пример простой формы (props)
Пример кода для формы с внешним состоянием
Код формы
<template>
<form
@submit.prevent="onSubmit"
@reset.prevent="onReset"
>
<div>
<input
v-model.lazy="$v.name.$model"
placeholder="Name"
>
<span v-if="$v.name.$error">
{{ $v.name.$errors[0].messages }}
</span>
</div>
<div>
<input
v-model.lazy="form.email"
type="email"
placeholder="Email"
>
<span v-if="$v.email.$error">
{{ $v.email.$errors[0].messages }}
</span>
</div>
<div>
<button type="submit">
Submit
</button>
<button type="reset">
Reset
</button>
</div>
</form>
</template>
import Vue from 'vue';
import { email, minLength, required } from '@vuelidate/validators';
import { computed, reactive } from '@vue/composition-api';
import { useForm } from '@/composition/form';
import mapSyncProps from '@/utils/map-sync-props';
export default Vue.extend({
props: {
name: {
type: String,
default: '',
},
email: {
type: String,
default: '',
},
pending: {
type: Boolean,
default: false,
},
},
setup(props, context) {
const form = reactive(mapSyncProps(context.emit, props));
// Если событие 'reset' обрабатывается из вне
// то функция не нужна
const reset = () => {
form.name = '';
form.email = '';
};
const rules = computed(() => ({
name: {
minLength: minLength(4),
required,
},
email: {
email,
required,
},
}));
const {
onSubmit,
onReset,
v,
} = useForm(context, { form, rules, reset });
return {
$v: v,
onSubmit,
onReset,
form,
};
},
});
Код родителя
import Vue from 'vue';
const defaultForm = () => ({
name: '',
email: '',
});
export default Vue.extend({
data: () => ({
form: defaultForm(),
pending: false,
}),
methods: {
onSubmit() {
console.log(this.form);
},
// Опционально, форма может сбрасываться как внутри
// так и отсюда
onReset() {
this.form = defaultForm();
},
},
});