Vue——插槽

目录

插槽内容与出口​

渲染作用域​

默认内容​

具名插槽​

动态插槽名​

作用域插槽​

具名作用域插槽​

高级列表组件示例​

无渲染组件​


插槽内容与出口​

在之前的章节中,我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,但组件要如何接收模板内容呢?在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。

举例来说,这里有一个  组件,可以像这样使用:


  Click me! 

而  的模板是这样的:


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

通过使用插槽, 组件更加灵活和具有可复用性。现在组件可以用在不同的地方渲染各异的内容,但同时还保证都具有相同的样式。

Vue 组件的插槽机制是受原生 Web Component  元素的启发而诞生,同时还做了一些功能拓展。

渲染作用域​

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

{{ message }}
{{ message }}

这里的两个 {{ message }} 插值表达式渲染的内容都是一样的。

插槽内容无法访问子组件的数据。Vue 模板中的表达式只能访问其定义时所处的作用域,这和 JavaScript 的词法作用域规则是一致的。换言之:

父组件模板中的表达式只能访问父组件的作用域;子组件模板中的表达式只能访问子组件的作用域。

默认内容​

在外部没有提供任何内容的情况下,可以为插槽指定默认内容。比如有这样一个  组件:


 如果我们想在父组件没有提供任何插槽内容时在 

现在,当我们在父组件中使用  且没有提供任何插槽内容时:


“Submit”将会被作为默认内容渲染:


但如果我们提供了插槽内容:

Save

那么被显式提供的内容会取代默认内容:


Vue——插槽_第1张图片

 

具名插槽​

有时在一个组件中包含多个插槽出口是很有用的。举例来说,在一个  组件中,有如下模板:

对于这种场景, 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的  出口会隐式地命名为“default”。

在父组件中使用  时,我们需要一种方式将多个插槽内容传入到各自目标插槽的出口。此时就需要用到具名插槽了:

要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的