问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Vue中Slot插槽的使用,同时也可以实现父子组件之间通信!

发布网友 发布时间:2024-09-25 15:36

我来回答

1个回答

热心网友 时间:2024-10-07 06:04

前言

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

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

环境准备

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

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

Category组件

<template><divclass="category"><h1>{{title}}</h1><ul><liv-for="(item,index)inlistData":key="index">{{item}}</li></ul></div></template><script>exportdefault{props:{listData:Array,title:String}}</script><stylescoped>.category{width:200px;height:300px;background-color:pink;}</style>

App组件

<template><divid="app"><Category:listData="games":title="'Games'"/><Category:listData="movies":title="'Movies'"/><Category:listData="foods":title="'Foods'"/></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{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><divclass="category"><!--定义插槽,插槽默认内容--><slot>如果当父组件不传值过来,即显示此默认</slot></div></template><script>exportdefault{props:{}}</script>

App组件也作出更改

<template><divid="app"><Category><h1>Games</h1><!--<ul><liv-for="(item,index)ingames":key="index">{{item}}</li></ul>--><imgsrc="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><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"><!--<ul>--><!--<liv-for="(item,index)inmovies":key="index">{{item}}</li>--><!--</ul>--></Category><Category><h1>Foods</h1><ul><liv-for="(item,index)infoods":key="index">{{item}}</li></ul></Category><!--当我们什么都没有写的时候,看展示什么--><Category></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category},data(){return{games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}</script>

显示效果:

解释:

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

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

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

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

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

二、具名插槽

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

改造子组件

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

父组件

<template><divid="app"><Category><templateslot="slot1"><h1>Games</h1><imgsrc="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><templateslot="slot2"><button>qq登录</button><button>微信登录</button></template></Category><Category><templateslot="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><templateslot="slot2"><button>点击购票</button></template></Category><Category><templateslot="slot1"><h1>Foods</h1><ul><liv-for="(item,index)infoods":key="index">{{item}}</li></ul></template></Category><!--当我们什么都没有写的时候,看展示什么--><Category></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category},data(){return{games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}</script>

效果展示

解释:

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

三、作用域插槽

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

改造的子组件

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

父组件

<template><divid="app"><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><!--如果不知道的咱们可以输出看看这是什么·{{listData}}--><ul><liv-for="(item,index)inlistData.foods":key="index">{{item}}</li></ul></template></Category><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><ol><liv-for="(item,index)inlistData.foods":key="index">{{item}}</li></ol></template></Category><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><h4v-for="(item,index)inlistData.foods":key="index">{{item}}</h4></template></Category><Category><templateslot="slot1"scope="listData">{{listData}}</template></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category}}</script>

效果图

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

解释:

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

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

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

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

大家好,我是博主宁在春。

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

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

热心网友 时间:2024-10-07 06:02

前言

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

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

环境准备

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

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

Category组件

<template><divclass="category"><h1>{{title}}</h1><ul><liv-for="(item,index)inlistData":key="index">{{item}}</li></ul></div></template><script>exportdefault{props:{listData:Array,title:String}}</script><stylescoped>.category{width:200px;height:300px;background-color:pink;}</style>

App组件

<template><divid="app"><Category:listData="games":title="'Games'"/><Category:listData="movies":title="'Movies'"/><Category:listData="foods":title="'Foods'"/></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{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><divclass="category"><!--定义插槽,插槽默认内容--><slot>如果当父组件不传值过来,即显示此默认</slot></div></template><script>exportdefault{props:{}}</script>

App组件也作出更改

<template><divid="app"><Category><h1>Games</h1><!--<ul><liv-for="(item,index)ingames":key="index">{{item}}</li></ul>--><imgsrc="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><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"><!--<ul>--><!--<liv-for="(item,index)inmovies":key="index">{{item}}</li>--><!--</ul>--></Category><Category><h1>Foods</h1><ul><liv-for="(item,index)infoods":key="index">{{item}}</li></ul></Category><!--当我们什么都没有写的时候,看展示什么--><Category></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category},data(){return{games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}</script>

显示效果:

解释:

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

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

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

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

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

二、具名插槽

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

改造子组件

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

父组件

<template><divid="app"><Category><templateslot="slot1"><h1>Games</h1><imgsrc="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><templateslot="slot2"><button>qq登录</button><button>微信登录</button></template></Category><Category><templateslot="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><templateslot="slot2"><button>点击购票</button></template></Category><Category><templateslot="slot1"><h1>Foods</h1><ul><liv-for="(item,index)infoods":key="index">{{item}}</li></ul></template></Category><!--当我们什么都没有写的时候,看展示什么--><Category></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category},data(){return{games:['穿越火线','qq飞车','洛克王国'],movies:['你好,李焕英','青春派','匆匆那年'],foods:['邵阳米粉','长沙茶颜','重庆火锅']}}}</script>

效果展示

解释:

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

三、作用域插槽

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

改造的子组件

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

父组件

<template><divid="app"><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><!--如果不知道的咱们可以输出看看这是什么·{{listData}}--><ul><liv-for="(item,index)inlistData.foods":key="index">{{item}}</li></ul></template></Category><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><ol><liv-for="(item,index)inlistData.foods":key="index">{{item}}</li></ol></template></Category><Category><templateslot="slot1"><h1>Foods</h1></template><templateslot="slot2"scope="listData"><h4v-for="(item,index)inlistData.foods":key="index">{{item}}</h4></template></Category><Category><templateslot="slot1"scope="listData">{{listData}}</template></Category></div></template><script>importCategoryfrom'./components/Category.vue'exportdefault{name:'App',components:{Category}}</script>

效果图

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

解释:

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

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

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

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

大家好,我是博主宁在春。

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

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
oppoa9私密相册在哪里(oppoa9私密相册在哪里查看) oppoa9私密照片怎么看(oppoa9手机设为私密的照片怎么找) oppoa9怎样找到自己的私密相册 安全阀有什么作用 安全阀是什么 安全阀的作用有哪些 一年级上课时训练40页的答案,有个数图形的机器人,⭕️有几个 一年级机器人有几个圆柱 斗鱼直播怎么投影到电视 直播投屏电视方法详解 斗鱼怎么在电视上看直播电视上看斗鱼直播教程 东芝电视如何安装斗鱼直播 乳鸽汤怎么炖鲜美可口? 怎么做乳鸽汤更有营养? 做乳鸽汤的方法与技巧有哪些? 乳鸽汤怎么熬有营养? 乳鸽汤怎么熬香浓? 乳鸽汤怎么做最补 超电子体系是什么意思? 因为公司马上要集团化,为集团起个新的名字。公司名字是:奇特。下属主营... 电脑鼠标超奇特问题 不见不散音箱北京总代理是哪家? 控制孩子的手机使用时间的软件 ?白鞋子发黄如何变白 我的数码相机摔坏了,说是变焦有问题了,怎么修呀 默然相爱,寂然欢喜。小说txt全集免费下载 ...办?我手机是OPPO的弄一下摄像头大概需要多少钱。。现在拍出_百度知... ...一下前置摄像头无法收起,怎么办,修一下大约需要多少钱? ...照相机打不开 这是怎么回事 修一下要多少钱? 211大学一共多少所 全国211大学 在苏宁买的单反进了一点海水,送去苏宁维修,后来回说修要1500块钱,就... xr续航时间 【Vue原理】Slot - 源码版之普通插槽 深入理解vue中的slot与slot-scope 怎么限制孩子玩手机? 传奇世界中秒杀在哪打求大神帮助 工行理财产品排行 暑期档2010年暑期档电影 2010暑期档上映的电影 2010暑期档有什么好电影 ...百度开放首页 我用的是火狐浏览器 一不小心删了。请问怎么弄... ...网址"功能是怎么添加的啊?这几天突然发现百度首页多了这个功能?这个... 晒娃小短萌句晒娃的唯美句子 夏天晒娃小短萌句 永泰能源为什么不涨 石油储量计算的基本公式是什么? 家电通用检测标准GB4706.1要求测试 九阳GB4706.1-1998,GB4706.30-2002是什么意思 这是九阳豆浆机的执行标... 上海回收单反相机? 龙猫为什么咬人 丝绒黑龙猫咬人吗 中性皮肤用什么牌子的洗面奶好