具名插槽
插槽:vue内容分发的机制,只能用在组件当中的 结合v-solt(出口)使用 <solt></slot>其实就是占位的作用 来接收html中组件标签里面的内容 最终页面渲染的是组件的template里的内容
具名插槽 : v-solt标签只能用于template标签中
在 <slot> 标签 添加 name属性指定 插槽名 , <slot name='自定义的插槽名'></slot>
在组件模板中可以添加多个插槽 , 使用具名插槽,通过 指定插槽名进行区分
语法格式:
<组件标签名>
<template v-slot:自定义插槽名>
.... 写入 内容(字符串, html, 组件 ...)
</template>
</组件标签名>
1 <div id="app"> 2 <!-- 1 组件标签内写入内容 --> 3 <!-- <first-child>hello world</first-child> --> 4 5 <!-- 默认是添加到 默认插槽 --> 6 <!-- <first-child> 7 <p>hello world ==== {{msg}}</p> 8 <ul> 9 <li>xiangmu</li> 10 <li>xiangmu</li> 11 <li>xiangmu</li> 12 <li>xiangmu</li> 13 </ul> 14 <h1>内容</h1> 15 </first-child> --> 16 17 18 <!-- =============== 具名插槽 需要结合v-slot 指令指定插槽名, v-slot 指令只能 用于 <template> 标签上 ; 页面渲染的结构 由组件模板决定, 而不是添加插槽内容的顺序 --> 19 20 <first-child> 21 <!-- 凡是没有指定具体的插槽名的内容 将被放到默认插槽中--> 22 <h1>也将会添加到默认插槽</h1> 23 24 <!-- 在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称: --> 25 <template v-slot:slide> 26 <p >hello world </p> 27 </template> 28 29 <template v-slot:content> 30 <second-child></second-child> 31 </template> 32 33 <!-- --> 34 <em>没有使用 template 标签包裹 </em> 35 36 </first-child> 37 38 <first-child> 39 <!-- 这两种方式都是往默认插槽分发内容,但是不能同时使用, 二选一, --> 40 41 <!-- 指定默认插槽 默认插槽名是 default --> 42 <template v-slot:default> 43 <strong>这个内容 ????</strong> 44 </template> 45 46 <!-- 默认使用 默认插槽 --> 47 <!-- <p>默认插槽==============</p> --> 48 49 </first-child> 50 </div>
1 <script src="./js/vue.global.min.js"></script> 2 <script> 3 const app = Vue.createApp({ 4 data(){ 5 return{ 6 msg:'hello vue3' 7 } 8 } 9 }) 10 11 const FirstChild = { 12 template:` 13 <div> 14 <p>默认的结构</p> 15 <div class='wrap'> 16 <div class='nav'> 17 <slot></slot> 18 </div> 19 <div class='slide'> 20 侧边栏: 21 <slot name='slide'></slot> 22 </div> 23 <div class='body'> 24 <slot name='content'> </slot> 25 </div> 26 </div> 27 </div> 28 ` 29 } 30 31 const SecondChild = { 32 template:` 33 <div> 34 组件作为插槽内容 35 </div> 36 ` 37 } 38 39 40 app.component('FirstChild', FirstChild) 41 app.component('SecondChild', SecondChild) 42 43 app.mount('#app') 44 </script>