<template>
和 <slot>
都是 Vue.js 框架中用于模板编程的标签,但它们在功能和应用场景上有所不同。
1. <template>
标签的作用
<template>
标签在 Vue.js 中用作一种声明性的方式来定义模板的片段。但它本身不会被渲染到最终的 DOM 中。<template>
的主要用途有:
-
条件渲染:使用
v-if
、v-else-if
和v-else
来控制模板片段的渲染。
<template>
<div>
<p v-if="showMessage">Hello, Vue!</p>
<p v-else>Goodbye, Vue!</p>
</div>
</template>
-
列表渲染:使用
v-for
指令来渲染列表。
<template>
<div>
<ul>
<li v-for="(item, index) in items" :key="index">{{ item }}</li>
</ul>
</div>
</template>
-
包装多个元素:在 Vue 的模板中,一个组件通常只能有一个根元素。但有时你可能需要包装多个元素。这时,你可以使用
<template>
作为包裹元素,但请注意,<template>
本身不会被渲染到最终的 DOM 中。
<template>
<template v-if="showMultipleElements">
<p>First paragraph.</p>
<p>Second paragraph.</p>
</template>
</template>
2. <slot>
标签的作用
<slot>
标签在 Vue.js 中用于内容分发。在子组件中,你可以使用 <slot>
标签作为内容的插槽,然后在父组件中使用该子组件时,向这个插槽插入内容。
- 默认插槽:当子组件中只有一个
<slot>
时,它就是默认插槽。
子组件:
<template>
<div>
<h2>Welcome to My Component</h2>
<slot></slot>
</div>
</template>
父组件:
<template>
<my-component>
<p>This is some content inserted into the slot.</p>
</my-component>
</template>
- 具名插槽:当子组件中有多个
<slot>
时,可以给它们命名以区分。
子组件:
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
父组件:
<template>
<my-component>
<template v-slot:header>
<h1>This is the header</h1>
</template>
<p>This is some default content.</p>
<template v-slot:footer>
<p>This is the footer</p>
</template>
</my-component>
</template>
这样,你就可以在父组件中向子组件的不同插槽插入不同的内容了。