Встроенные специальные элементы
Не компоненты
<component>, <slot> и <template> являются компонентоподобными функциями и частью синтаксиса шаблонов. Они не являются настоящими компонентами и удаляются при компиляции шаблона. Поэтому в шаблонах их принято писать со строчной буквы.
<component>
«Мета-компонент» для отображения динамических компонентов или элементов.
Пропсы
tsinterface DynamicComponentProps { is: string | Component }Подробности
Фактический компонент для отрисовки определяется параметром
is.Если
is— это строка, то это может быть либо имя HTML-тега, либо зарегистрированное имя компонента.В качестве альтернативы
isможно также напрямую привязать к определению компонента.
Пример
Отрисовка компонентов по зарегистрированному имени (Options API):
vue<script> import Foo from './Foo.vue' import Bar from './Bar.vue' export default { components: { Foo, Bar }, data() { return { view: 'Foo' } } } </script> <template> <component :is="view" /> </template>Отрисовка компонентов по определению (Composition API с
<script setup>):vue<script setup> import Foo from './Foo.vue' import Bar from './Bar.vue' </script> <template> <component :is="Math.random() > 0.5 ? Foo : Bar" /> </template>Отрисовка HTML-элементов:
template<component :is="href ? 'a' : 'span'"></component>Все встроенные компоненты могут быть переданы в
is, но вы должны зарегистрировать их, если хотите передавать их по имени. Например:vue<script> import { Transition, TransitionGroup } from 'vue' export default { components: { Transition, TransitionGroup } } </script> <template> <component :is="isGroup ? 'TransitionGroup' : 'Transition'"> ... </component> </template>Регистрация не требуется, если вы передаете в
isсам компонент, а не его имя, например, в<script setup>.Если
v-modelиспользуется в теге<component>, компилятор шаблонов расширит его до свойстваmodelValueи слушателя событияupdate:modelValue, как и для любого другого компонента. Однако это не будет совместимо с нативными элементами HTML, такими как<input>или<select>. В результате использованиеv-modelс динамически созданным нативным элементом не будет работать:vue<script setup> import { ref } from 'vue' const tag = ref('input') const username = ref('') </script> <template> <!-- Это не сработает, так как 'input' является собственным элементом HTML --> <component :is="tag" v-model="username" /> </template>На практике этот крайний случай встречается нечасто, поскольку в реальных приложениях родные поля форм обычно обёрнуты в компоненты. Если вам необходимо использовать нативный элемент напрямую, то вы можете разделить
v-modelна атрибут и событие вручную.Смотрите также Динамические компоненты
<slot>
Обозначает выходы содержимого слотов в шаблонах.
Пропсы
tsinterface SlotProps { /** * Любые параметры, переданные в <slot>, будут передаваться * в качестве аргументов для слотов, имеющих скопированное значение */ [key: string]: any /** * Зарезервировано для указания имени слота */ name?: string }Подробности
Элемент
<slot>может использовать атрибутnameдля указания имени слота. Еслиимяне указано, будет отображаться слот по умолчанию. Дополнительные атрибуты, переданные элементу slot, будут переданы в качестве параметров слота в слот, определённый в родителе.Сам элемент будет заменён содержимым соответствующего слота.
Элементы
<slot>в шаблонах Vue компилируются в JavaScript, поэтому их не следует путать с нативными элементами<slot>.Смотрите также Компоненты - Слоты
<template>
Тег <template> используется в качестве заполнителя, когда мы хотим использовать встроенную директиву без отрисовки элемента в DOM.
Подробности
Специальная обработка
<template>срабатывает только в том случае, если он используется с одной из этих директив:v-if,v-else-ifилиv-elsev-forv-slot
Если ни одна из этих директив не присутствует, то вместо этого он будет отображаться как нативный элемент
<template>.Шаблон
<template>сv-forможет также иметь атрибутkey. Все остальные атрибуты и директивы будут отброшены, поскольку они не имеют смысла без соответствующего элемента.Однофайловые компоненты используют тег верхнего уровня
<template>для обёртывания всего шаблона. Это использование отделено от использования<template>, описанного выше. Этот тег верхнего уровня не является частью самого шаблона и не поддерживает синтаксис шаблона, например, директивы.Смотрите также