Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

插槽 Slots

插槽内容与出口

一个 <FancyButton> 组件,可以像这样使用:

1
2
3
<FancyButton>
Click me! <!-- 插槽内容 -->
</FancyButton>

<FancyButton> 的模板是这样的:

1
2
3
<button class="fancy-btn">
<slot></slot> <!-- 插槽出口 -->
</button>

<slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。

插槽内容可以是任意合法的模板内容,不局限于文本。例如我们可以传入多个元素,甚至是组件:

1
2
3
4
<FancyButton>
<span style="color:red">Click me!</span>
<AwesomeIcon name="plus" />
</FancyButton>

渲染作用域

插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在父组件模板中定义的。

插槽内容无法访问子组件的数据。Vue 模板中的表达式只能访问其定义时所处的作用域。

具名插槽

<slot> 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

1
2
3
4
5
6
7
8
9
10
11
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>

要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令:

1
2
3
4
5
<BaseLayout>
<template v-slot:header>
<!-- header 插槽的内容放这里 -->
</template>
</BaseLayout>

v-slot 有对应的简写 #

作用域插槽

插槽的内容无法访问到子组件的状态。

像对组件传递 props 那样,向一个插槽的出口上传递 attributes:

1
2
3
4
<!-- <MyComponent> 的模板 -->
<div>
<slot :text="greetingMessage" :count="1"></slot>
</div>

默认插槽接受 props

1
2
3
<MyComponent v-slot="slotProps">
{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

具名作用域插槽

1
2
3
4
5
6
7
8
9
10
11
12
13
<MyComponent>
<template #header="headerProps">
{{ headerProps }}
</template>

<template #default="defaultProps">
{{ defaultProps }}
</template>

<template #footer="footerProps">
{{ footerProps }}
</template>
</MyComponent>

向具名插槽中传入 props:

1
<slot name="header" message="hello"></slot>

评论