插槽
和 HTML 元素一样,我们希望可以向一个组件标签内传递内容,像这样:
<Child>文章标题</Child>
我们希望“文章标题”四个字能插入到Child组件中,但是运行代码后会发现,Child组件中什么都不会有。因为在 Vue 中,并不支持这样往组件中添加内容的语法。
但是没关系,Vue 中提供了另外一个东西 —— 插槽元素<slot>
一、基础语法
二、插槽内容
<slot>元素作为插槽承载内容的出口。也就是说,我们从组件标签中传递的内容,会显示在<slot>标签所在位置。
例如我们在Child.vue组件中设置如下:
<slot></slot><h2>子组件自己的内容</h2>
当我们再使用Child.vue组件时:
<Child><h1>父组件传递给插槽的内容</h1></Child>
说明:插槽内可以包含任何模板代码,包括 HTML,甚至是其它的组件。
三、后备内容(默认值)
后备内容,就是指在设置插槽的时候,可以直接在<slot>元素中为插槽设置默认的内容。如果外部没有插入内容,插槽的默认值就会渲染出来。
例如我们在Child.vue组件中设置如下:
<slot>这是插槽的默认内容</slot><h2>子组件自己的内容</h2>
当我们再使用Child.vue组件时,不传递任何插槽内容:
<Child></Child>
四、具名插槽
具名插槽指的就是给插槽取名字。<slot>元素提供了一个特殊的特性:name。这个特性可以通过给插槽命名的方式来定义额外的插槽:
<slot name="before"></slot><h2>子组件自己的内容</h2><slot name="after"></slot>
在向具名插槽提供内容的时候,我们可以在一个<template>元素上使用v-slot指令,并以v-slot的参数的形式提供其名称:
<Child><template v-slot:before><h1>父组件传递给插槽的内容(前面)</h1></template><template v-slot:after><h1>父组件传递给插槽的内容(后面)</h1></template></Child>
注意:**v-slot**指令只能用在组件或**<template>**元素身上。
