内置特殊元素
非组件
<component>
, <slot>
和 <template>
是类似组件的功能和模板语法的一部分。它们不是真正的组件,在模板编译过程中会被编译掉。因此,它们通常在模板中以小写形式书写。
<component>
渲染动态组件或元素的“元组件”。
属性
tsinterface DynamicComponentProps { is: string | Component }
详情
实际要渲染的组件由
is
属性确定。当
is
是一个字符串时,它可以是HTML标签名或组件的注册名。或者,
is
也可以直接绑定到组件的定义。
示例
通过注册名渲染组件(选项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>
通过定义渲染组件(使用
<script setup>
的 Composition API)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 元素
模板<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>
中,则不需要注册。如果在
<component>
标签上使用v-model
,模板编译器将将其展开为modelValue
属性和update:modelValue
事件监听器,就像对任何其他组件所做的那样。然而,这不会与原生 HTML 元素兼容,例如<input>
或<select>
。因此,使用v-model
与动态创建的原生元素不会工作vue<script setup> import { ref } from 'vue' const tag = ref('input') const username = ref('') </script> <template> <!-- This won't work as 'input' is a native HTML element --> <component :is="tag" v-model="username" /> </template>
在实践中,这种边缘情况并不常见,因为原生表单字段通常在真实应用中被封装在组件中。如果你确实需要直接使用原生元素,则可以手动将
v-model
分解为一个属性和事件。另请参阅 动态组件
<slot>
表示模板中的槽内容出口。
属性
tsinterface SlotProps { /** * Any props passed to <slot> to passed as arguments * for scoped slots */ [key: string]: any /** * Reserved for specifying slot name. */ name?: string }
详情
可以使用
<slot>
元素的name
属性来指定槽名称。如果没有指定name
,则将渲染默认槽。传递给槽元素的额外属性将作为作用域插槽的槽属性传递给父组件中定义的插槽。元素本身将被其匹配的槽内容替换。
Vue 模板中的
<slot>
元素被编译成 JavaScript,因此不要与 原生的<slot>
元素 混淆。另请参阅 组件 - 插槽
<template>
当想要使用内置指令而不在 DOM 中渲染元素时,使用 <template>
标签作为占位符。
详情
只有在使用以下这些指令之一时,才会对
<template>
进行特殊处理v-if
、v-else-if
或v-else
v-for
v-slot
如果没有这些指令中的任何一个,则将渲染为一个 原生的
<template>
元素。具有
v-for
的<template>
也可以有一个key
属性。所有其他属性和指令都将被丢弃,因为它们没有对应元素就没有意义。单文件组件使用一个 顶级
<template>
标签 来包装整个模板。这种用法与上述<template>
的用法是分开的。顶级标签不是模板本身的一部分,也不支持模板语法,如指令。另请参阅