В Element Plus динамические компоненты позволяют создавать интерфейсы, где тип компонента или его содержание изменяются во время выполнения приложения. Это особенно важно при работе с формами, таблицами, модальными окнами и интерактивными панелями, где структура интерфейса заранее неизвестна или зависит от состояния данных.
component и isДля создания динамического компонента используется атрибут
is. Он позволяет указать имя компонента, который будет
отрисован на данном месте.
<template>
<component :is="currentComponent" />
</template>
<script setup>
import { ref } from 'vue';
import { ElButton, ElInput } from 'element-plus';
const currentComponent = ref('ElButton');
const switchComponent = () => {
currentComponent.value = currentComponent.value === 'ElButton' ? 'ElInput' : 'ElButton';
};
</script>
Ключевые моменты:
is может быть строкой с именем
зарегистрированного глобально компонента или объектом локальной
регистрации.Для динамически изменяемых компонентов важно не только переключать сам компонент, но и передавать ему разные свойства. Это делается через биндинг:
<template>
<component
:is="currentComponent"
v-bind="componentProps"
/>
</template>
<script setup>
import { ref } from 'vue';
import { ElButton, ElInput } from 'element-plus';
const currentComponent = ref('ElButton');
const componentProps = ref({ type: 'primary', size: 'medium', label: 'Нажми меня' });
const switchComponent = () => {
if (currentComponent.value === 'ElButton') {
currentComponent.value = 'ElInput';
componentProps.value = { placeholder: 'Введите текст', clearable: true };
} else {
currentComponent.value = 'ElButton';
componentProps.value = { type: 'success', size: 'small', label: 'Отправить' };
}
};
</script>
v-bind="componentProps" позволяет передавать сразу
несколько свойств без необходимости прописывать их отдельно.Element Plus часто используется с ElTable, где динамические компоненты позволяют создавать ячейки с различным типом содержимого.
<template>
<el-table :data="tableData">
<el-table-column prop="name" label="Имя" />
<el-table-column label="Действие">
<template #default="scope">
<component
:is="scope.row.type === 'button' ? 'el-button' : 'el-input'"
v-bind="scope.row.props"
/>
</template>
</el-table-column>
</el-table>
</template>
<script setup>
import { ref } from 'vue';
import { ElButton, ElInput, ElTable, ElTableColumn } from 'element-plus';
const tableData = ref([
{ name: 'Алексей', type: 'button', props: { type: 'primary', size: 'small', label: 'Нажми' } },
{ name: 'Мария', type: 'input', props: { placeholder: 'Введите текст', clearable: true } },
]);
</script>
template #default="scope" можно получать объект
строки scope.row для условного рендеринга.При работе с ElForm динамические компоненты дают возможность создавать формы на основе данных JSON или конфигураций.
<template>
<el-form :model="formData">
<component
v-for="(field, index) in fields"
:key="index"
:is="field.component"
v-model="formData[field.model]"
v-bind="field.props"
/>
</el-form>
</template>
<script setup>
import { ref } from 'vue';
import { ElInput, ElSelect, ElOption } from 'element-plus';
const formData = ref({ username: '', role: '' });
const fields = ref([
{ component: 'el-input', model: 'username', props: { placeholder: 'Имя пользователя' } },
{
component: 'el-select',
model: 'role',
props: { placeholder: 'Выберите роль' },
options: ['Админ', 'Пользователь', 'Гость']
},
]);
</script>
v-model может быть привязано к любому свойству
объекта формы.v-for для генерации опций динамически.В Element Plus компоненты могут быть зарегистрированы локально или глобально. Для динамического рендеринга важно правильно управлять импортом и регистрацией:
<script setup>
import { ref, defineAsyncComponent } from 'vue';
const components = {
ElButton: defineAsyncComponent(() => import('element-plus/es/components/button')),
ElInput: defineAsyncComponent(() => import('element-plus/es/components/input')),
};
const currentComponent = ref('ElButton');
</script>
<template>
<component :is="components[currentComponent]" />
</template>
defineAsyncComponent позволяет загружать компоненты
только при необходимости, что уменьшает размер начальной сборки
приложения.components делает код более
читаемым и управляемым.Для сложных интерфейсов часто необходимо сохранять состояние
компонента при его переключении. Для этого используют ключи
(:key) и v-model:
<component
:is="currentComponent"
:key="currentComponent"
v-model="value"
/>
:key заставляет Vue пересоздавать компонент при
смене, сохраняя корректность состояния.v-model позволяет связывать состояние динамического
компонента с реактивной переменной, обеспечивая двустороннюю
привязку.:key), чтобы правильно управлять
жизненным циклом компонента при частых изменениях.Динамические компоненты в Element Plus предоставляют гибкий инструмент для построения адаптивных интерфейсов, где элементы могут изменяться в зависимости от данных, пользовательских действий и состояния приложения. Они интегрируются с формами, таблицами и любыми контейнерами, обеспечивая высокую переиспользуемость и управляемость кода.