前言

插槽可以说是 Vue 中非常重要的一部分吧,在我学习和练习的过程中,当组件搭配着插槽一起使用的时候,会发挥的更好一些。更多时候也会更加方便。

今天介绍Vue中三种插槽吧:默认插槽、具名插槽、作用域插槽。

环境准备

先搭个初始环境给大家看看哈。一步一步讲完这个插槽。

就是写了一个类别组件,分别渲染这三种数据。

Category组件

<template><div class="category"><h1>{{title}}</h1><ul><li v-for="(item,index) in listData":key="index">{{item}}</li></ul></div>
</template>
<script>
export default {props: {listData:Array,title: String}
}
</script>
<style scoped>
.category{width: 200px;height: 300px;background-color:pink;
}
</style>

App组件

<template><div id="app"><Category :listData="games" :title="'Games'" /><Category :listData="movies" :title="'Movies'" /><Category :listData="foods" :title="'Foods'" /></div>
</template>
<script>
import Category from './components/Category.vue'
export default {name: 'App',components: {Category},data () {return {games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}
}
</script>
<style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;display: flex;justify-content: space-between;
}
</style>

最开始就是如上图一样的需求,但是现在业务需求更改了,电影变成了只宣传其中一个,其他的不进行宣传,吃的也变成只宣传一个拉。

如下图:

我们怎么改合适呢?

是在Category组件中加if一个个进行判断吗?还是有更好的方法勒???


一个个判断是不行的,那样子代码会变得十分繁杂,不易阅读,万一以后又要更改业务需求,代码都不好动。

接下来就到默认插槽的出现拉。

一、默认插槽

我们在子组件中不用再用props 接收数据,也不做渲染,而是定义一个插槽。

<template>
<div class="category"><!-- 定义插槽,插槽默认内容 --><slot>如果当父组件不传值过来,即显示此默认</slot></div>
</template>
<script>export default {props: {}}
</script>

App组件也作出更改

<template>
<div id="app"><Category><h1>Games</h1><!-- <ul>
<li v-for="(item, index) in games" :key="index">{{ item }}</li></ul> --><img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Fb352264fa7bfdb6d211f2e71e87cc2c48d85b805.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931135&t=0b2c6c622c84a1e387196cce8f50455e"></Category><Category><h1>Movies</h1><img class="movies" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13236694597%2F641.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931502&t=f89c2197bda9bb129d9404d3c4b30f2f"><!-- <ul> --><!-- <li v-for="(item, index) in movies" :key="index">{{ item }}</li> --><!-- </ul> --></Category><Category><h1>Foods</h1><ul><li v-for="(item, index) in foods" :key="index">{{ item }}</li></ul></Category><!-- 当我们什么都没有写的时候,看展示什么 --><Category></Category></div>
</template><script>import Category from './components/Category.vue'export default {name: 'App',components: {Category},data () {return {games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}
</script>

显示效果:

解释:

我们在子组件写了一个<slot>如果当父组件不传值过来,即显示此默认</slot> 标签,此处就相当于占了一个位置。

我们在父组件中,也不再像之前一样<Category/>写自闭和标签,而是写了非自闭和标签<Category> 内容 </Category>。这样做,Vue就会默认的将写在组件标签中的内容渲染完,然后再放回子组件中的 <slot></slot> 占好位置的地方去。

注意:CSS样式写在父组件或者子组件中都是可以的,因为它是渲染完后才放回子组件中的。写在子组件中,就是在放回子组件中时渲染。


写完这里,客户突然觉得你们这么厉害,不满足啦,又开始给你们整幺蛾子。

接下来就又到具名插槽登场啦哈。

二、具名插槽

竟然我们能够想到用一个插槽啦,那么为什么不能想着用两个插槽来试一试勒?

改造子组件

<template><div class="category"><!-- 必须加上名称 在父组件中才能指定要放入那个插槽 这也是为什么叫做具名插槽的原因---><slot name="slot1">如果当父组件不传值过来,即显示此默认</slot><slot name="slot2"></slot></div>
</template>
<script>
export default {props: {}
}
</script>

父组件

<template><div id="app"><Category><template slot="slot1"><h1>Games</h1><img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Fb352264fa7bfdb6d211f2e71e87cc2c48d85b805.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931135&t=0b2c6c622c84a1e387196cce8f50455e"/></template><template slot="slot2"><button > qq登录</button><button > 微信登录</button></template></Category>
<Category><template slot="slot1"><h1>Movies</h1><imgclass="movies"src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13236694597%2F641.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931502&t=f89c2197bda9bb129d9404d3c4b30f2f"/></template><template slot="slot2"><button > 点击购票</button></template>
</Category><Category><template slot="slot1"><h1>Foods</h1><ul><li v-for="(item, index) in foods" :key="index">{{ item }}</li></ul></template>
</Category><!-- 当我们什么都没有写的时候,看展示什么 -->
<Category> </Category>
</div>
</template><script>import Category from './components/Category.vue'export default {name: 'App',components: {Category},data () {return {games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}
</script>

效果展示

解释:

我们可以在组件中放多个slot,但是多个的时候必须要给他们命名,另外父组件中也要进行指定,这样才不会放不进去。


三、作用域插槽

作用域插槽和前面稍稍有点不同,之前都是数据在父组件中,而作用域插槽是数据在子组件中,反过来传递给父组件,让父组件定义结构进行渲染。

改造的子组件

<template><div class="category"><slot name="slot1">如果当父组件不传值过来,即显示此默认</slot><slot name="slot2" :foods="foods">如果当父组件不传值过来,即显示此默认</slot></div>
</template>
<script>
export default {data () {return{foods:['邵阳米粉','长沙茶颜','重庆火锅']}}
}
</script>

父组件

<template><div id="app"><Category><template slot="slot1"><h1>Foods</h1></template><template slot="slot2" scope="listData"><!--如果不知道的 咱们可以输出看看这是什么· {{listData}}  --><ul><li v-for="(item, index) in listData.foods" :key="index">{{ item }}</li></ul></template></Category><Category><template slot="slot1"><h1>Foods</h1></template><template slot="slot2" scope="listData"><ol><li v-for="(item, index) in listData.foods" :key="index">{{ item }}</li></ol></template></Category><Category><template slot="slot1"><h1>Foods</h1></template><template slot="slot2" scope="listData"><h4 v-for="(item, index) in listData.foods" :key="index">{{ item }}</h4></template></Category><Category><template slot="slot1" scope="listData">
{{listData}}</template></Category></div>
</template><script>
import Category from './components/Category.vue'export default {name: 'App',components: {Category}
}
</script>

效果图

这种我在学习及练习过程中,并没有想到哪些使用场景,但是在官网上有案例,我想它必定是有存在的理由,只是我的见识太少,而未能利用到而已。

解释:

子组件中通过:变量名="定义的数据" 向父组件传值,父组件用<template slot="slot2" scope="不用和子组件传递过来的名称相同"> 接收,因为还要. 一层,才到

<template slot="slot2" scope="listData">
<!--如果不知道的 咱们可以输出看看这是什么· {{listData}}  -->
<ul><li v-for="(item, index) in listData.foods" :key="index">{{ item }}</li></ul>
</template>

后语

大家一起加油!!!如若文章中有不足之处,请大家及时指出,在此郑重感谢。

纸上得来终觉浅,绝知此事要躬行。

大家好,我是博主宁在春:主页

一名喜欢文艺却踏上编程这条道路的小青年。

希望:我们,待别日相见时,都已有所成

「后端小伙伴来学前端了」关于 Vue中 Slot 插槽的使用,实用且也是组件中必会的一个知识,另外也可以实现父子组件之间通信相关推荐

  1. 「后端小伙伴来学前端了」关于 Vue中的 props

    校园的晚霞 前言 学vue必须要会的就是组件这玩意啦,不然可能就约等于白学. 我自己前期完成老师布置的任务,不瞒你说,交上去,直接被骂,原因就是我一个组件没抽

  2. 「后端小伙伴来学前端了」分析Vue脚手架结构

    傍晚的月亮 前言 每日匆匆忙忙的写老师布置的 Vue 项目,对于 Vue 始终没有一个系统的认知,每天都是遇到什么问题就去查什么样的问题.看起来好像也没啥问题,但是所有的知识都是混入的,导致没有一个像 ...

  3. 「后端小伙伴来学前端了」关于Vue中的自定义事件,组件绑定自定义事件实现通信

    傍晚的月亮 前言 原本这篇打算写Vue中的那个全局事件总线的原理,但是发现自己少写了这个自定义事件,不讲明白这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉. 一.v-on指令 要讲自定 ...

  4. 「后端小伙伴来学前端了」Vue脚手架中 render 函数

    前言 上一篇文章写了:「后端小伙伴来学前端了」分析Vue脚手架结构 简单说明了Vue的脚手架结构,但是上篇文章还欠了个小点没有说完,就在这篇文章中补齐.就是所谓的render函数. 一.main.js ...

  5. 「后端小伙伴来学前端了」Vue中 this.$set的用法 | 可用于修改对象中数组的某一个对象、 可用于更新数据到视图

    夜晚有明月,梦里有佳人 前言 最近在写老师布置的vue项目,真的说实话,每天真就是在百度.google.bing等各个搜索引擎之间反复横跳,不然就是掘金搜一搜.思否搜一搜,还有CSDN看一看.我的前端 ...

  6. 「后端小伙伴来学前端了」Vue中Props 实现组件通信TodoList案例

    自己拍的小云彩 源码在文末. 前言 上篇文章写了个V利用Props进行组件之间的通信,这不立马就安排上这个案例拉丫.光学不敲等于没学哈(资深大佬除外哈) 目标就是实现如下的样子: 能够进行增删改查,并 ...

  7. 「后端小伙伴来学前端了」Vue中学会使用Echarts生成各种各样的图表,得学学了,必须要会的基本操作了

    依旧还是学妹给的封面 直接进入主题-在vue中使用个啥,都差不多是一个流程. 引入Echarts 安装 npm install echarts --save 我们写一个Echarts组件,在内进行引入 ...

  8. 「后端小伙伴来学前端了」Vue中全局事件总线(GlobalEventBus)原理及探究过程

    前言 上一篇文章写了 Vue 中的自定义事件,自定义事件是全局事件总线基础.我在上一篇文章中埋下了一个小小的伏笔.如下图: 我说过,在Vue中如果我们用(@orv-on)给组件绑定上一个自定义事件,其 ...

  9. 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信

    月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...

最新文章

  1. 劳动节,这样的自动叠衣服机器人给我来10个
  2. 【深度学习入门到精通系列】对抗样本和对抗网络
  3. springboot拦截器拦截提示_Springboot拦截器使用及其底层源码剖析
  4. 三位分节制顺口溜_1-3年级基础知识顺口溜!
  5. Could not install from “echarts\lib\visual\dataColor“ as it does not contain a package.json file.
  6. 保护 .NET Core 项目的敏感信息
  7. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程
  8. Virtual Machine Manager 2012 R2利用服务模板部署DC
  9. 【Elasticsearch】Lucene 中的 Stored Fields 存储优化 自定义 存储类型 序列化 方式
  10. ImportError: No module named cv2问题的解决方法(修改python默认版本)
  11. 【Django 2021年最新版教程5】前端传递数据到后端处理 GET 方法
  12. 下载zxing的网址
  13. Mysql的可视化工具整理
  14. OSGeolive 开源GIS 使用
  15. 第三方SSD问题引起电脑频繁重启问题IONVMeController.cpp:5499
  16. 安卓自动化工具(附自动刷抖音脚本实例)
  17. 个人2台网站服务器,急急急 如何架设个人web服务器
  18. 12位中年程序员:代码一敲十年,收入虽高前途摇摆
  19. matlab画图常见问题,matlab常见问题集
  20. 简单爬今日头条街拍获取图集

热门文章

  1. FI 与MM SD的接口配置基本方法
  2. 关于SAP的“Sort key 排序码”
  3. Function宝典
  4. bash 脚本中激活conda环境_ubuntu18.10目标检测算法环境部署+开机自启动脚本创建screen下的web服务...
  5. 基于php响应式网站毕业论文,基于html5与css3的响应式web页面设计与实现.docx
  6. SQL语言之DML语言学习(一) 数据插入与修改操作语言
  7. CTF(pwn)堆利用 之 off by one
  8. ctf -- 内存取证分析工具volatility的下载与安装+简单的使用
  9. 解决:SyntaxError: Non-ASCII character ‘\xe8‘ in file 1.py on line 4, but no encoding declared;
  10. Python中的高效的集合操作