Атрибут is в Vue3
isАтрибут is — ключевой атрибут в Vue для реализации динамических компонентов. Он используется для динамического указания, каким компонентом должен отрисовываться текущий элемент.
Базовое объяснение
isАтрибут is в основном используется в сценариях динамических компонентов, позволяя динамически переключать разные компоненты для отрисовки во время выполнения в зависимости от данных. Это основной способ реализации функциональности динамических компонентов в Vue.
- Тип: String | Component
- Назначение: Динамическое переключение компонентов для повторного использования компонентов и динамического рендеринга.
Базовое использование
1. Динамическое переключение компонентов
Использование<component>элемент вместе сisатрибут позволяет реализовать динамические компоненты:
Пример
<div>
<!-- currentComponent может быть строкой, например 'ComponentA', 'ComponentB' и т. д. -->
<component :is="currentComponent"></component>
<button @click="toggleComponent">Переключить компонент</button>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
export default {
data() {
return {
currentComponent: 'ComponentA'
}
},
components: {
ComponentA,
ComponentB
},
methods: {
toggleComponent() {
this.currentComponent = this.currentComponent === 'ComponentA'
? 'ComponentB'
: 'ComponentA'
}
}
}
</script>
2. Использование объектов компонентов
Значением is также может быть непосредственно объект компонента:
Пример
<div>
<component :is="currentComponent"></component>
<button @click="switchToA">Показать A</button>
<button @click="switchToB">Показать B</button>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
export default {
data() {
return {
currentComponent: ComponentA
}
},
methods: {
switchToA() {
this.currentComponent = ComponentA
},
switchToB() {
this.currentComponent = ComponentB
}
}
}
</script>
Сценарии использования
1. Переключение вкладок
Достигается эффект, аналогичный переключению вкладок:
Пример
<div>
<!-- Навигация по вкладкам -->
<button
v-for="tab in tabs"
:key="tab.name"
:class="{ active: currentTab === tab.name }"
@click="currentTab = tab.name"
>
{{ tab.label }}
</button>
<!-- Динамический компонент -->
<component :is="currentTabComponent" />
</div>
</template>
<script>
import HomeTab from './tabs/HomeTab.vue'
import ProfileTab from './tabs/ProfileTab.vue'
import SettingsTab from './tabs/SettingsTab.vue'
export default {
data() {
return {
currentTab: 'Home',
tabs: [
{ name: 'Home', label: 'Главная', component: HomeTab },
{ name: 'Profile', label: 'Профиль', component: ProfileTab },
{ name: 'Settings', label: 'Настройки', component: SettingsTab }
]
}
},
computed: {
currentTabComponent() {
const tab = this.tabs.find(t => t.name === this.currentTab)
return tab ? tab.component : null
}
}
}
</script>
2. Условный рендеринг разных компонентов
Динамически выбирайте компонент для рендеринга на основе условий:
Пример
<div>
<select v-model="selectedType">
<option value="warning">Предупреждение</option>
<option value="error">Ошибка</option>
<option value="success">Успех</option>
</select>
<component :is="alertComponent" :message="message" />
</div>
</template>
<script>
import WarningAlert from './WarningAlert.vue'
import ErrorAlert from './ErrorAlert.vue'
import SuccessAlert from './SuccessAlert.vue'
export default {
data() {
return {
selectedType: 'warning',
message: 'Это уведомление'
}
},
computed: {
alertComponent() {
const componentMap = {
warning: WarningAlert,
error: ErrorAlert,
success: SuccessAlert
}
return componentMap[this.selectedType]
}
}
}
</script>
Использование is на нативных элементах
В Vue 3.1+, когдаisатрибут is используется на нативных HTML-элементах, он интерпретируется как возможность пользовательских элементов (custom elements) нативной веб-платформы.
Но иногда нужно заменять нативные элементы на компоненты Vue в DOM-шаблонах. Например, в<table>используя пользовательские компоненты в качестве строк:
Пример
<tbody>
<tr is="vue:my-row-component"></tr>
</tbody>
</table>
Использованиеvue:префикс позволяет Vue отображать элемент как компонент Vue вместо нативного HTML-элемента.
Примечания
Значение атрибута is: Это может быть строка с именем компонента или объект компонента. При использовании строки имя компонента должно совпадать с именем зарегистрированного компонента.
Использование вычисляемых свойств: Вы можете возвращать разные компоненты на основе сложной условной логики, обеспечивая более гибкое динамическое переключение компонентов.
Кэширование динамических компонентов с помощью keep-alive
Использование<keep-alive>Обёртывание динамических компонентов кэширует экземпляры компонентов, избегая повторного создания при каждом переключении:
Пример
<div>
<button @click="currentTab = 'home'">Главная</button>
<button @click="currentTab = 'profile'">Профиль</button>
<keep-alive>
<component :is="currentTabComponent" />
</keep-alive>
</div>
</template>
<script>
export default {
data() {
return {
currentTab: 'home'
}
},
computed: {
currentTabComponent() {
return this.currentTab + '-tab'
}
}
}
</script>
<keep-alive>Он кэширует экземпляры компонентов, которые были переключены. Когда компонент отображается снова, он восстанавливается непосредственно из кэша, а не создаётся заново.
Другие расширения
Встроенные атрибуты Vue3