内置特殊元素
内置特殊元素
在 Vue3 中的内置特殊元素, <component>
元素可以根据动态变量来动态切换组件的渲染,<slot>
元素可以在组件中定义可插入的内容,并在父组件中进行替换,<template>
元素则可以用来包裹多个元素或者作为条件渲染和循环的容器。
在 Vue3 中的特殊属性(Attributes),key
属性用于为列表中的每个元素提供唯一标识符,以便 Vue 能够高效地更新 DOM;ref
属性允许我们在模板和 JavaScript 之间建立引用的连接,方便我们操作 DOM 元素或组件;is
属性在动态组件中用于指定要渲染的组件类型。
特殊元素
1. <component>
元素
<component>
元素是 Vue 中的动态组件,它可以在模板中根据不同的组件名称动态切换渲染的组件。下面是一个示例:
<template>
<component :is="currentComponent"></component>
</template>
<script setup>
import ComponentA from "./ComponentA.vue";
import ComponentB from "./ComponentB.vue";
let currentComponent = "ComponentA";
setTimeout(() => {
currentComponent = "ComponentB";
}, 2000);
</script>
在上面的代码中,我们通过使用:is
属性将currentComponent
变量绑定到<component>
,根据currentComponent
的值来决定渲染哪个组件。初始情况下,会渲染ComponentA
组件,2 秒后切换为ComponentB
组件。
需要注意的是,动态组件的名称可以是组件的实例或者组件的选项对象。另外,当使用动态组件时,可以通过设置keep-alive
来缓存组件,以提高性能。
2. <slot>
元素
<slot>
元素是 Vue 中的插槽,它可以用于在组件中定义可插入的内容,并在组件的模板中进行占位。下面是一个示例:
<template>
<div>
<h1>这是一个插槽示例</h1>
<slot></slot>
</div>
</template>
<script setup>
// 父组件模板中:
// <Component>
// <p>插入的内容</p>
// </Component>
</script>
在上面的代码中,<slot>
元素将会在组件的模板中占位,并且可以通过父组件中插入的内容进行替换。在父组件中,我们可以像使用普通 HTML 标签一样使用自定义组件,并在其中插入内容。
需要注意的是,<slot>
元素可以具有默认插槽内容。如果没有在父组件中插入内容,则会显示默认插槽内容。
3. <template>
元素
在 Vue 中,<template>
元素通常用来包裹多个元素或者作为条件渲染和循环的容器。下面是一个示例:
<template>
<div>
<h1>条件渲染示例</h1>
<template v-if="show">
<p>显示的内容</p>
</template>
<template v-else>
<p>隐藏的内容</p>
</template>
</div>
</template>
<script setup>
let show = true;
setTimeout(() => {
show = false;
}, 2000);
</script>
特殊 Attributes
1. key 属性
key
属性在 Vue3 中是一个特殊的属性,它用于在列表渲染时为每个元素提供唯一的标识符。下面是一个示例:
<template>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script setup>
const items = [
{ id: 1, name: "Item 1" },
{ id: 2, name: "Item 2" },
{ id: 3, name: "Item 3" },
];
</script>
在上面的代码中,我们使用v-for
指令对items
数组进行遍历,在每个li
元素上添加了:key="item.id"
属性,其中item.id
作为每个元素的唯一标识符。
需要注意的是,当使用v-for
进行列表渲染时,key
是必需的。它帮助 Vue 跟踪每个元素的身份,以便在添加、删除或重新排序时高效地更新 DOM。
2. ref 属性
ref
属性允许我们在模板中通过一个唯一的标识符引用一个元素或组件,并且可以在 JavaScript 中进行访问。下面是一个示例:
<template>
<div>
<p ref="paragraph">这是一个段落</p>
<button @click="changeText">改变文本</button>
</div>
</template>
<script setup>
import { ref } from "vue";
const paragraph = ref(null);
function changeText() {
paragraph.value.textContent = "文本已改变";
}
</script>
在上面的代码中,我们使用ref="paragraph"
为<p>
元素添加了 ref 属性,并使用const paragraph = ref(null)
在 JavaScript 中创建了一个响应式引用。
需要注意的是,使用ref
属性需要在 Vue3 中导入ref
函数,通过ref(value)
将一个普通的数据转化为响应式引用。同时,在 JavaScript 中通过访问value
属性可以获取到实际的 DOM 元素。
3. is 属性
is
属性在 Vue3 中是一个特殊的属性,它主要用于在动态组件中指定要渲染的组件类型。下面是一个示例:
<template>
<component :is="currentComponent"></component>
<button @click="changeComponent">切换组件</button>
</template>
<script setup>
import ComponentA from "./ComponentA.vue";
import ComponentB from "./ComponentB.vue";
let currentComponent = "ComponentA";
function changeComponent() {
currentComponent =
currentComponent === "ComponentA" ? "ComponentB" : "ComponentA";
}
</script>