Element Plus — это библиотека компонентов для Vue 3, ориентированная на создание интерфейсов с высокой степенью повторного использования. Архитектура приложения с Element Plus строится вокруг компонентного подхода, где каждый визуальный элемент интерфейса реализован как отдельный Vue-компонент.
Ключевые аспекты:
<template>), скрипт
(<script setup>) и стили
(<style scoped>).props и
получая события через emits.ElButton, ElTable, ElForm и
т.д.<template>
<el-form :model="formData">
<el-form-item label="Имя">
<el-input v-model="formData.name" />
</el-form-item>
<el-button type="primary" @click="submitForm">Отправить</el-button>
</el-form>
</template>
<script setup>
import { ref } from 'vue';
const formData = ref({ name: '' });
function submitForm() {
console.log(formData.value);
}
</script>
Element Plus позволяет регистрировать компоненты
глобально, что упрощает использование их в различных
частях приложения без повторного импорта. Глобальная регистрация
выполняется в основном файле приложения (main.js или
main.ts):
import { createApp } from 'vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
import App from './App.vue';
const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');
Преимущества глобальной регистрации:
Для более точного контроля можно регистрировать компоненты локально внутри конкретного компонента Vue:
<script setup>
import { ElButton, ElInput } from 'element-plus';
</script>
<template>
<el-input placeholder="Введите текст" v-model="text" />
<el-button type="success">Сохранить</el-button>
</template>
Локальная регистрация позволяет уменьшить размер сборки приложения, так как подключаются только необходимые компоненты.
Element Plus не предоставляет собственного механизма управления состоянием, но его компоненты тесно интегрируются с Vue 3 Composition API и Vuex/Pinia.
Пример использования Pinia для формы с Element Plus:
// store/form.js
import { defineStore } from 'pinia';
import { ref } from 'vue';
export const useFormStore = defineStore('form', () => {
const name = ref('');
const email = ref('');
const reset = () => {
name.value = '';
email.value = '';
};
return { name, email, reset };
});
<template>
<el-form>
<el-form-item label="Имя">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="Email">
<el-input v-model="form.email" />
</el-form-item>
<el-button @click="form.reset">Очистить</el-button>
</el-form>
</template>
<script setup>
import { useFormStore } from '@/store/form';
const form = useFormStore();
</script>
Element Plus включает мощную систему сетки, которая
позволяет создавать адаптивные интерфейсы. Основные элементы:
ElRow и ElCol.
<el-row :gutter="20">
<el-col :span="8">
<el-card>Колонка 1</el-card>
</el-col>
<el-col :span="8">
<el-card>Колонка 2</el-card>
</el-col>
<el-col :span="8">
<el-card>Колонка 3</el-card>
</el-col>
</el-row>
Особенности сетки:
gutter — расстояние между колонками.span — количество единиц сетки, которые занимает
колонка (всего 24 единицы на ряд).xs, sm, md, lg,
xl.Element Plus позволяет настраивать стили через темы и CSS-переменные:
// main.js
import 'element-plus/theme-chalk/dark/css-vars.css';
Или через динамическую настройку переменных SCSS:
$--color-primary: #409eff;
$--font-size-base: 14px;
Использование темизации гарантирует единообразие интерфейса и упрощает поддержку крупных приложений.
Element Plus активно использует слоты для кастомизации контента. Это позволяет внедрять пользовательские элементы внутрь стандартных компонентов:
<el-button type="primary">
<template #icon>
<el-icon><Check /></el-icon>
</template>
Подтвердить
</el-button>
Особенности слотов:
#default — основной контент компонента.#header, #footer)
позволяют расширять функциональность стандартных компонентов.scoped slots) дают доступ к
внутреннему состоянию компонента.Компоненты ElForm и ElFormItem обеспечивают
удобную архитектуру для валидации форм:
<el-form :model="formData" :rules="rules" ref="formRef">
<el-form-item label="Email" prop="email">
<el-input v-model="formData.email" />
</el-form-item>
<el-button type="primary" @click="submitForm">Отправить</el-button>
</el-form>
import { ref } from 'vue';
const formData = ref({ email: '' });
const formRef = ref(null);
const rules = {
email: [
{ required: true, message: 'Введите email', trigger: 'blur' },
{ type: 'email', message: 'Неверный формат', trigger: 'blur' }
]
};
function submitForm() {
formRef.value.validate((valid) => {
if (valid) {
console.log('Форма валидна', formData.value);
} else {
console.log('Ошибка валидации');
return false;
}
});
}
Преимущества встроенной валидации:
validator.Для больших приложений рекомендуется использовать ленивую загрузку компонентов, чтобы оптимизировать размер сборки:
import { defineAsyncComponent } from 'vue';
const AsyncTable = defineAsyncComponent(() =>
import('element-plus/es/components/table')
);
Это особенно важно при использовании тяжёлых компонентов, таких как
ElTable с большими данными или ElTree с
глубокой структурой.
Архитектура приложения на Element Plus сочетает:
Эта структура обеспечивает масштабируемость и поддерживаемость интерфейсов на крупных проектах, одновременно сохраняя чистоту кода и стандартизацию визуального оформления.