一直模糊所以梳理一下,看了好多篇园友的文章和官网文档在这整理一下

默认插槽

//slot组件
<template>
<div class="slots">
slot的用法
<SlotChild>
<div class="no-name">我是嵌在子组件内不具有属性名的标签</div>
</SlotChild>
</div>
</template> <script>
import SlotChild from 'component/slotChild'
export default {
name: 'slots',
components:{
SlotChild
},
data () {
return { }
}
}
</script>
//slot的子组件
<template>
<div class="slot-child">
我是slot的子组件
</div>
</template> <script>
export default {
name: 'slotChild',
data () {
return { }
}
}
</script>

页面渲染效果

通过上面的内容可以知道,在slot组件中引入了slot的子组件,而且又在子组件标签内添加了新的标签内容,但页面上并没有将子组件标签内的标签内容显示出来,

所以说在不适用slot的情况下,在子组件标签内添加Dom是无效的

现在来修改slot的子组件

<template>
<div class="slot-child">
   //在子组件中添加slot标签
<slot></slot>
我是slot的子组件
</div>
</template> <script>
export default {
name: 'slotChild',
data () {
return { }
}
}
</script>

页面效果图

由此可见,使用slot后可以在子组件内显示插入的新标签

具名插槽

子组件

<template>
<div class="slottwo">
<div>slottwo</div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>

在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer

父组件

<template>
<div>
我是父组件
<slot-two>
<p>啦啦啦,啦啦啦,我是卖报的小行家</p>
<template slot="header">
<p>我是name为header的slot</p>
</template>
<p slot="footer">我是name为footer的slot</p>
</slot-two>
</div>
</template>

在父组件中使用template并写入对应的slot值来指定该内容在子组件中现实的位置(当然也不用必须写到template),没有对应值的其他内容会被放到子组件中没有添加name属性的slot中

插槽的默认内容

父组件

<template>
<div>
我是父组件
<slot-two></slot-two>
</div>
</template>

子组件

<template>
<div class="slottwo">
<slot>我不是卖报的小行家</slot>
</div>
</template>

可以在子组件的slot标签中写入内容,当父组件没有写入内容时会显示子组件的默认内容,当父组件写入内容时,会替换子组件的默认内容

作用域插槽

子组件

<template>
<div>
我是作用域插槽的子组件
<slot :data="user"></slot>
</div>
</template> <script>
export default {
name: 'slotthree',
data () {
return {
user: [
{name: 'Jack', sex: 'boy'},
{name: 'Jone', sex: 'girl'},
{name: 'Tom', sex: 'boy'}
]
}
}
}
</script>

在子组件的slot标签上绑定需要的值

父组件

<template>
<div>
我是作用域插槽
<slot-three>
<template slot-scope="user">
<div v-for="(item, index) in user.data" :key="index">
{{item}}
</div>
</template>
</slot-three>
</div>
</template>

在父组件上使用slot-scope属性,user.data就是子组件传过来的值

v-slot 指令自 Vue 2.6.0 起被引入,提供更好的支持 slot 和 slot-scope attribute 的 API 替代方案。在接下来所有的 2.x 版本中 slot 和 slot-scope attribute 仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。

vue 废弃了 slot 和 slot-scope 推荐使用新的v-slot,上面看完简单理解一下就行了,毕竟旧的语法到vue3.0才真正废弃:

肯定有朋友好奇 v-slot:default是什么: 其实就是具名插槽名,默认插槽为default 

 

 还可以更简单 像v-bind一样 v-slot 可以简写为#   :v-slot:header = #header  

 但要注意了! 和其它指令一样,该缩写只在其有参数的时候才可用。这意味着以下语法是无效的:

<!-- 这样会触发一个警告 -->

<current-user #="{ user }">

  {{ user.firstName }}

  </current-user>

如果你希望使用缩写的话,你必须始终以明确插槽名取而代之:

<current-user #default="{ user }">
{{ user.firstName }}
</current-user>
 

  

你甚至可以动态定义它:

注意不可以混用!:

 官方提供了更便捷的 解构插槽 看一下就懂了:

最新文章

  1. Echarts 之二——地市联动数据统计
  2. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
  3. [函数] Firemonkey 取得 Windows 目前 User 的 Desktop 目录
  4. 攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系
  5. Range
  6. 12、NFC技术:读写NFC标签中的Uri数据
  7. [Everyday Mathematics]20150109
  8. typeof应该注意的地方(网龙公司校招笔试题)
  9. iOS实现地图半翻页效果--老代码备用参考
  10. 用 Eclipse 开发 Android 应用程序
  11. avi文件格式详解【转】
  12. jquery实现导航栏头部点击变换颜色
  13. jquery中table里面的tr里的input添加一行,并且第一列autoincrement
  14. 两个实验操作系统-ubuntu在安装配置pintos
  15. 《java系统性能优化》--2.高速缓存
  16. (转)CentOS无损调整磁盘分区大小的实现方法
  17. HNOI2013 BZOJ3142 数列
  18. bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp
  19. mysql底层原理
  20. [hdu6148][Valley Numer]

热门文章

  1. 解决dede编辑器不能保存word文档样式问题
  2. 网络协议之:WebSocket的消息格式
  3. 初探DispatcherServlet#doDispatch
  4. sonar扫面代码总体流程
  5. self this
  6. 《DotNet Web应用单文件部署系列》三、混淆dll文件
  7. linux 测试2
  8. CF123E Maze(期望dp,树形dp,式子)
  9. python中\t、\n含义
  10. 生日礼物网页Javascript版本与锚点版本