Vue躬行记(6)——内容分发
Vue提供了一种内容分发技术,可将父组件中的内容传递给子组件的模板,实现方式参照了Web组件规范草案。
一、插槽
Vue内置了一个<slot>元素,能作为插槽(slot)存在,而插槽内可包含文本、HTML片段、组件等。以下面的btn组件为例,其模板中包含一个<slot>元素,在DOM中为btn组件添加了文本内容。
<btn>提交</btn><script> Vue.component("btn", { template: '<button><slot></slot></button>' }); </script>
渲染出的<button>元素会包含“提交”,即插槽被替换成了分发的内容,如下所示。
<button>提交</button>
在插槽中允许添加默认的内容(即为<slot>元素附加内容,如下所示),当父组件没有传递内容时,它们就会被渲染。
Vue.component("btn", { template: '<button><slot>提交</slot></button>' });
二、具名插槽
具名插槽是指包含名称的插槽,即指定了name特性的<slot>元素。当组件的模板中需要多个插槽时,就得通过名称来加以区分。例如有一个page组件,包含三个<slot>元素,其中有两个声明了name特性,如下所示。
Vue.component("page", { template: `<div> <header><slot name="header"></slot></header> <section><slot></slot></section> <footer><slot name="footer"></slot></footer> </div>`});
如果要向具名插槽传递内容,那么可以在<template>元素上使用v-slot指令,并让插槽名称成为它的参数,如下所示。
<page> <template v-slot:header> <h1>头部</h1> </template> <p>内容</p> <template v-slot:footer> <h1>尾部</h1> </template></page>
渲染出的DOM结构如下所示,分发的内容替换了对应的插槽。
<div> <header> <h1>头部</h1> </header> <section> <p>内容</p> </section> <footer> <h1>尾部</h1> </footer></div>
所有没有被包裹在带v-slot指令的<template>元素中的内容(例如上面的<p>元素),都会传递给没有名称的插槽(即默认插槽)。
注意,一个不带name特性的<slot>元素,其实也有名称,叫default。在v-slot指令中,也可以对其进行指定,如下所示。
&