插槽 Slots
插槽内容与出口
一个 <FancyButton>
组件,可以像这样使用:
1 | <FancyButton> |
而 <FancyButton>
的模板是这样的:
1 | <button class="fancy-btn"> |
<slot>
元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。
插槽内容可以是任意合法的模板内容,不局限于文本。例如我们可以传入多个元素,甚至是组件:
1 | <FancyButton> |
渲染作用域
插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在父组件模板中定义的。
插槽内容无法访问子组件的数据。Vue 模板中的表达式只能访问其定义时所处的作用域。
具名插槽
<slot>
元素可以有一个特殊的 attribute name
,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:
1 | <div class="container"> |
要为具名插槽传入内容,我们需要使用一个含 v-slot
指令的 <template>
元素,并将目标插槽的名字传给该指令:
1 | <BaseLayout> |
v-slot 有对应的简写 #
作用域插槽
插槽的内容无法访问到子组件的状态。
像对组件传递 props 那样,向一个插槽的出口上传递 attributes:
1 | <!-- <MyComponent> 的模板 --> |
默认插槽接受 props
1 | <MyComponent v-slot="slotProps"> |
具名作用域插槽
1 | <MyComponent> |
向具名插槽中传入 props:
1 | <slot name="header" message="hello"></slot> |