Для интеграции Element Plus в проект на Nuxt 3 используется официальный плагин. Начать следует с установки пакета через npm или yarn:
npm install element-plus
# или
yarn add element-plus
После установки создается плагин для регистрации компонентов
глобально. В папке plugins создается файл, например
element-plus.js:
import { defineNuxtPlugin } from '#app'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(ElementPlus)
})
Использование плагина позволяет использовать все компоненты Element Plus в любом месте приложения без повторного импорта.
Element Plus поддерживает глобальные стили и переменные для темизации. Для этого используется файл стилей с переменными SCSS:
// assets/styles/element-variables.scss
$--color-primary: #409eff;
$--font-size-base: 14px;
Подключение переменных осуществляется через конфигурацию Nuxt
(nuxt.config.ts):
export default defineNuxtConfig({
css: [
'element-plus/dist/index.css',
'~/assets/styles/element-variables.scss'
],
build: {
transpile: ['element-plus']
}
})
Это позволяет централизованно изменять основные цвета, размеры и шрифты компонентов.
Компоненты Element Plus можно использовать как глобально, так и локально. Пример глобального использования кнопки:
<template>
<el-button type="primary">Основная кнопка</el-button>
</template>
Для локального использования:
<script setup>
import { ElButton } from 'element-plus'
</script>
<template>
<el-button type="success">Локальная кнопка</el-button>
</template>
Компоненты форм, такие как el-form,
el-input, el-select, интегрируются с
Vuelidate или встроенными правилами Element
Plus. Пример формы с валидацией:
<template>
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="Имя" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="Email" prop="email">
<el-input v-model="form.email" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">Отправить</el-button>
</el-form-item>
</el-form>
</template>
<script setup>
import { ref } from 'vue'
const formRef = ref(null)
const form = ref({
name: '',
email: ''
})
const rules = {
name: [{ required: true, message: 'Введите имя', trigger: 'blur' }],
email: [
{ required: true, message: 'Введите email', trigger: 'blur' },
{ type: 'email', message: 'Неверный формат email', trigger: ['blur', 'change'] }
]
}
function submitForm() {
formRef.value.validate((valid) => {
if (valid) {
console.log('Форма корректна', form.value)
} else {
console.log('Ошибка валидации')
}
})
}
</script>
Для уменьшения размера сборки в Nuxt 3 можно
использовать онлайн-импорт компонентов через
unplugin-vue-components. Установка:
npm install -D unplugin-vue-components unplugin-auto-import
Конфигурация в nuxt.config.ts:
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default defineNuxtConfig({
vite: {
plugins: [
Components({
resolvers: [ElementPlusResolver()],
}),
],
},
})
Теперь компоненты подключаются автоматически при их использовании, что снижает время загрузки и размер пакета.
Element Plus предоставляет глобальные сервисы:
ElMessage, ElMessageBox,
ElNotification. Их использование в Nuxt аналогично:
import { ElMessage, ElMessageBox } from 'element-plus'
function showMessage() {
ElMessage({
message: 'Данные сохранены',
type: 'success'
})
}
async function confirmAction() {
try {
await ElMessageBox.confirm('Вы уверены?', 'Подтверждение', {
confirmButtonText: 'Да',
cancelButtonText: 'Нет',
type: 'warning'
})
console.log('Подтверждено')
} catch {
console.log('Отменено')
}
}
Element Plus поддерживает мультиязычность. Для интеграции:
npm install element-plus@next
Импорт и настройка локали:
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import ru from 'element-plus/es/locale/lang/ru'
const app = createApp(App)
app.use(ElementPlus, { locale: ru })
В Nuxt 3 это делается через плагин
plugins/element-plus.js:
import { defineNuxtPlugin } from '#app'
import ElementPlus from 'element-plus'
import ru from 'element-plus/es/locale/lang/ru'
import 'element-plus/dist/index.css'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(ElementPlus, { locale: ru })
})
Element Plus имеет отдельный пакет иконок
@element-plus/icons-vue. Установка:
npm install @element-plus/icons-vue
Пример использования:
<script setup>
import { Search } from '@element-plus/icons-vue'
</script>
<template>
<el-button icon="Search">Поиск</el-button>
</template>
Или с динамическим компонентом:
<el-button>
<component :is="Search" />
Поиск
</el-button>
Для полного контроля над стилями рекомендуется использовать SCSS-переменные с vite-plugin-style-import или через глобальный SCSS-файл:
// assets/element-custom.scss
$--color-primary: #1f8ceb;
$--button-border-radius-base: 6px;
$--input-height-base: 40px;
Подключение через nuxt.config.ts:
css: ['~/assets/element-custom.scss'],
build: {
transpile: ['element-plus']
}
Это позволяет создавать уникальный дизайн интерфейса, полностью совместимый с компонентами Element Plus.
Компоненты, такие как el-menu или
el-breadcrumb, легко интегрируются с Nuxt
Router для динамического построения меню:
<template>
<el-menu :default-active="activePath" router>
<el-menu-item v-for="route in routes" :key="route.path" :index="route.path">
{{ route.name }}
</el-menu-item>
</el-menu>
</template>
<script setup>
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
const routes = [
{ path: '/home', name: 'Главная' },
{ path: '/about', name: 'О сайте' }
]
const activePath = route.path
</script>
Это обеспечивает полную совместимость навигации Nuxt с визуальными компонентами Element Plus и позволяет создавать динамичные интерфейсы без лишних костылей.