5-7 组件及组件间的通信-slot内容分发
目录:
- slot内容分发
- 为什么要用slot内容分发
- 单个slot
- 具名slot
一、slot内容分发
slot本意:位置、槽
作用:用来获取组件中的原内容,它其实是一个组件,在Vue api中:slot
slot分类:单个slot,具名slot
二、为什么要用slot内容分发?
根据我们之前学的东西,看下如下代码:
<body>
<div id="box">
<!--在引用组件内部,添加内容-->
<my-hello>teacher gao is very handsome</my-hello>
</div>
<!--my-hello的引用模板-->
<template id="hello">
<div>
<h3>欢迎来到高哥哥的博客园</h3>
</div>
</template>
<script src="../vue.js"></script>
<script>
let vm = new Vue({
el: "#box",
components:{
'my-hello':{ //局部组件my-hello
template: "#hello"
}
}
});
</script>
</body>
看下页面输出结果:
欢迎来到高哥哥的博客园
我们再来看看 引用组件中间还有我们想要输出的内容,如下:
<my-hello>teacher gao is very handsome</my-hello>
那如何获取呐,这个时候就要用到 slot 内容分发了。
三、单个slot
单个slot,又叫匿名slot,它是没有名字的,会获取你引用组件中的内容,并且在页面上显示出来,例子如下:
<body>
<div id="box">
<my-hello>teacher gao is very handsome</my-hello>
</div>
<template id="hello">
<div>
<h3>欢迎来到高哥哥的博客园</h3>
<!--引用单个slot组件,获取<my-hello>组件中间的内容-->
<slot></slot> <!--<slot>如果没有原内容,则显示该内容</slot> => <my-hello>中没有值,就会显示:如果没有原内容,则显示该内容-->
</div>
</template>
<script src="../vue.js"></script>
<script>
.....//上面的例子有
</script>
</body>
输出内容如下:
欢迎来到高哥哥的博客园 #<my-hello>组件模板中h3显示的内容 teacher gao is very handsome #<my-hello>teacher gao is very handsome</my-hello> 中间的内容
你看看,作用还是很大的吧。
三、具名slot
单个slot是蛮好的,但是有的时候吧,我在我的组件标签中,有多个标签,而且我想把标签放在不同的位置,这个时候只是一个单个slot是不够用的,那咋办呐?这个时候我们就用到具名slot。用法如下:
<div id="box">
<my-compont>
<!--2.使用具名slot-->
<p slot="slot名">高哥哥真帅!!!</p>
</my-compont>
</div>
<template id="hello">
<div>
<!--1.定义具名slot位置-->
<slot name="slot名"></slot>
</div>
</template>
好了,废话不多少,直接上实例:
<body>
<div id="box">
<my-hello>
<p slot="s1">高哥哥真帅!!!</p>
<p slot="s2">鸿哥哥真丑!!!</p>
</my-hello>
</div>
<template id="hello">
<div>
<slot name="s1"></slot>
<h3>欢迎来到高哥哥的博客园</h3>
<slot name="s2"></slot>
</div>
</template>
<script src="../vue.js"></script>
<script>
.....//上面代码中有
</script>
</body>
输出结果如下:
高哥哥真帅!!! #<slot name="s1"></slot> => <p slot="s1">高哥哥真帅!!!</p> 欢迎来到高哥哥的博客园 #<h3>欢迎来到高哥哥的博客园</h3> 鸿哥哥真丑!!! # <slot name="s2"></slot> => <p slot="s2">鸿哥哥真丑!!!</p>
这样有很好理解啦。有的时候具名slot和单个slot是配合使用的。

浙公网安备 33010602011771号