В Element Plus управление состоянием форм строится
на концепции реактивных данных Vue. Компоненты форм
(el-form, el-form-item) тесно интегрированы с
объектами данных, что позволяет автоматически отслеживать изменения
полей и управлять валидацией.
v-modelКаждое поле формы в Element Plus связывается с объектом модели с
помощью директивы v-model. Например:
<template>
<el-form :model="formData">
<el-form-item label="Имя">
<el-input v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="Возраст">
<el-input-number v-model="formData.age"></el-input-number>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
formData: {
name: '',
age: null
}
};
}
};
</script>
formData — реактивный объект, автоматически
обновляющийся при изменении полей формы.ref для
формыДля программного контроля состояния формы используется
ref:
<el-form ref="myForm" :model="formData" :rules="rules">
...
</el-form>
<script>
import { ref } from 'vue';
export default {
setup() {
const formData = ref({ name: '', age: null });
const myForm = ref(null);
const rules = {
name: [{ required: true, message: 'Введите имя', trigger: 'blur' }],
age: [{ type: 'number', required: true, message: 'Введите возраст', trigger: 'change' }]
};
const validateForm = () => {
myForm.value.validate((valid) => {
if (valid) {
console.log('Форма валидна', formData.value);
} else {
console.log('Ошибка валидации');
return false;
}
});
};
return { formData, myForm, rules, validateForm };
}
};
</script>
ref позволяет вызывать методы формы, такие как
validate, resetFields,
clearValidate.validate выполняет проверку всех полей по заданным
правилам.Element Plus поддерживает динамическое наблюдение за
изменением отдельных полей через watch или
реактивные свойства Vue:
import { watch, reactive } from 'vue';
const formData = reactive({ name: '', age: null });
watch(() => formData.name, (newValue, oldValue) => {
console.log(`Имя изменилось с ${oldValue} на ${newValue}`);
});
Правила валидации могут изменяться в зависимости от состояния других полей:
const rules = reactive({
email: [
{ required: true, message: 'Введите email', trigger: 'blur' },
{ type: 'email', message: 'Неверный формат', trigger: 'blur' }
]
});
watch(() => formData.age, (age) => {
if (age < 18) {
rules.email.push({ message: 'Email не требуется для несовершеннолетних', validator: () => true });
}
});
Когда в приложении есть несколько связанных форм, можно использовать общий объект состояния:
const globalFormState = reactive({
personal: { name: '', age: null },
contact: { email: '', phone: '' }
});
<el-form :model="globalFormState.personal">...</el-form>
<el-form :model="globalFormState.contact">...</el-form>
validate на каждой форме или объединить их в общий
метод.При использовании Vuex или Pinia данные формы можно синхронизировать с глобальным состоянием:
import { useStore } from 'vuex';
const store = useStore();
const formData = computed({
get: () => store.state.form,
set: (value) => store.commit('updateForm', value)
});
| Метод | Назначение |
|---|---|
validate(callback) |
Проверяет форму и возвращает результат в callback |
resetFields() |
Сбрасывает значения полей к исходным |
clearValidate(field) |
Очищает ошибки валидации, поле необязательно |
validateField(prop, cb) |
Проверяет одно поле формы |
Эти методы позволяют полностью контролировать состояние формы и синхронизацию с моделью данных.
reactive,
ref, computed) или Object.assign
для обновления модели.reactive, что позволяет синхронизировать
формы с вложенными структурами данных.const formData = reactive({
user: { name: '', age: null },
address: { city: '', zip: '' }
});
<el-form :model="formData">
<el-form-item label="Имя">
<el-input v-model="formData.user.name"></el-input>
</el-form-item>
<el-form-item label="Город">
<el-input v-model="formData.address.city"></el-input>
</el-form-item>
</el-form>
formData.Эти принципы позволяют создавать гибкие, динамичные формы в Element Plus с полной синхронизацией состояния, управлением валидацией и интеграцией с внешними хранилищами данных.