金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

vue2.x插槽slot学习笔记插槽x插槽y-csdn博客

阿维 2025-11-01 21:34:18

每经编辑|陈东升    

当地时间2025-11-01,gfyuweutrbhedguifhkstebtj,成色斗阴91

Vue2.x插槽(Slot):组件(jian)通信(xin)的(de)“万(wan)能钥匙”

想(xiang)象一下(xia),你(ni)正在(zai)搭建(jian)一座(zuo)复(fu)杂的(de)数(shu)字(zi)积木王(wang)国,每(mei)个(ge)积(ji)木(mu)都(dou)是一个独(du)立的(de)组件。你(ni)希(xi)望这(zhe)些积木之(zhi)间能够(gou)灵(ling)活(huo)地(di)组合(he)、互相传递信息,并且(qie)能够根据(ju)不(bu)同(tong)的场(chang)景展示不同(tong)的(de)内(nei)容(rong)。这时候,Vue2.x的(de)插槽(Slot)机(ji)制(zhi)就如同魔(mo)法一(yi)般,为(wei)你提供(gong)了解决(jue)这一(yi)切问(wen)题的“万(wan)能钥(yao)匙(shi)”。

它允许你(ni)将组件的(de)某些部分(fen)“镂空”,以便(bian)在(zai)组件(jian)使用时(shi),能够(gou)动态地注(zhu)入任(ren)意(yi)的HTML结构或组件(jian),极大(da)地增(zeng)强了(le)组(zu)件的(de)复用性(xing)和灵活(huo)性。

为什么需要(yao)插槽?组件设计(ji)的“解耦艺术”

在没有(you)插槽之(zhi)前(qian),如果(guo)一个(ge)父(fu)组(zu)件(jian)需要(yao)向子组(zu)件传递(di)一(yi)些(xie)动态的(de)内容,我们(men)通常会(hui)选(xuan)择props。props主(zhu)要用于传递数(shu)据,当我(wo)们(men)需要传递的是一段(duan)复杂(za)的HTML结构,或(huo)者(zhe)需(xu)要动态(tai)地(di)在子组(zu)件(jian)的特(te)定位置渲染不(bu)同(tong)的内(nei)容(rong)时,props就(jiu)显得力(li)不(bu)从心(xin)了。

父组件不得(de)不直(zhi)接去操(cao)作(zuo)子(zi)组(zu)件的DOM,或者(zhe)将子(zi)组件(jian)设(she)计(ji)得过于(yu)臃肿,承(cheng)担了本(ben)不该它(ta)承担的(de)渲染职(zhi)责。

插槽的出现(xian),正(zheng)是为了(le)解决(jue)这个问(wen)题。它倡(chang)导的是一(yi)种“内(nei)容(rong)分(fen)发(fa)”的理念:父组件(jian)负责提供内容,子组件(jian)负责(ze)提供“容器(qi)”和“布(bu)局”。子(zi)组(zu)件(jian)定义好(hao)哪些部(bu)分是(shi)可以被外(wai)部填(tian)充的(de),而父(fu)组件(jian)则可以自(zi)由地在(zai)这(zhe)些(xie)“容(rong)器”里填(tian)充自己(ji)的内容。这种设(she)计,将(jiang)组(zu)件的(de)“结(jie)构”和(he)“内容(rong)”进(jin)行(xing)了有(you)效的解耦,让组件的(de)设计更加(jia)纯(chun)粹、职责(ze)更(geng)加单一(yi),也更(geng)易于维护和复(fu)用。

默认插(cha)槽(DefaultSlot):最简单(dan)的(de)“内容注(zhu)入”

插(cha)槽(cao)最基础、最常见的形(xing)式(shi)就是默认(ren)插槽(cao)。在子(zi)组件的(de)模(mo)板中,你只(zhi)需要(yao)使用(yong)一个(ge)标签(qian),就(jiu)创(chuang)建了一(yi)个(ge)默认插槽。当(dang)父(fu)组件使(shi)用这个子组(zu)件(jian)时,如果(guo)父(fu)组件模(mo)板中(zhong)子组件(jian)标签内(nei)部包(bao)含有内容,那(na)么这(zhe)些内(nei)容(rong)就会被渲染到(dao)子组(zu)件(jian)的位置(zhi)。

举(ju)个例子(zi),我们(men)创(chuang)建(jian)一(yi)个Card组(zu)件(jian),它(ta)有一个(ge)标题(ti)区域(yu)和内(nei)容区(qu)域,我们(men)希望标题(ti)是固定的,但(dan)内容区域可以(yi)根据使(shi)用者的需求而变(bian)化。

DefaultCardTitle

现(xian)在,在父组件中(zhong),我们可(ke)以这样使用Card组件(jian),并在(zai)其(qi)中填充(chong)内容:

这(zhe)是(shi)Card组件的(de)内(nei)容,可以(yi)是我想要的(de)任(ren)何HTML结构(gou)!点击我(wo)

当这段代(dai)码(ma)渲染时,

和(he)这两段内(nei)容就(jiu)会被(bei)“塞(sai)进(jin)”Card组件(jian)的(de)位置,显示在(zai)card-body区域。是不是很(hen)简单?这(zhe)就好像给你(ni)的(de)组件提(ti)供了一(yi)个(ge)“空盒子”,使用者可以(yi)往里面放(fang)任(ren)何(he)他们(men)想(xiang)要的东(dong)西。具名插(cha)槽(NamedSlots):让(rang)内容(rong)“各(ge)归其位(wei)”在实(shi)际(ji)开发中(zhong),我们(men)往往需要在组件(jian)中(zhong)预留多个(ge)可(ke)以被(bei)填(tian)充(chong)的位置。如(ru)果(guo)还只使(shi)用默认(ren)插槽(cao),就很容易(yi)造成内容(rong)的混(hun)乱(luan),无法精(jing)准(zhun)地(di)将内(nei)容注入到(dao)指定的位置。这(zhe)时候,具名(ming)插槽(cao)就派上(shang)用场(chang)了。具名插槽允许(xu)我们给标签一个name属(shu)性,来为它(ta)命名(ming)。在父(fu)组件(jian)使用子(zi)组(zu)件时(shi),通过给要注(zhu)入(ru)的内容一个v-slot指(zhi)令(ling)(简(jian)写为(wei)#),并指(zhi)定对应的(de)插(cha)槽(cao)名称,就可以将内容精准(zhun)地“投(tou)递(di)”到指定(ding)的(de)插(cha)槽位(wei)置(zhi)。我(wo)们来(lai)扩展一下(xia)Card组(zu)件(jian),让它同(tong)时支持(chi)标题和内容两个插槽。DefaultCardTitleDefaultfootertext.在(zai)父组(zu)件中,我们(men)就可以这(zhe)样使用(yong):CustomCardTitleThisisthemaincontentthatgoesintothedefaultslot.LearnMore

这(zhe)里和(he)是关键。它(ta)们告诉Vue,在这个(ge)标签(qian)包裹(guo)的(de)内(nei)容(rong),应该被插入(ru)到Card组件(jian)中name="header"和(he)name="footer"的插槽(cao)位置(zhi)。简写(xie)#:让代码(ma)更(geng)简洁(jie)Vue提供了v-slot的简写(xie)形式(shi)#,让具名插槽的(de)使(shi)用(yong)更(geng)加(jia)简洁。上面的例(li)子可(ke)以改写为(wei):CustomCardTitleThisisthemaincontentthatgoesintothedefaultslot.LearnMore

理解(jie)插槽的作(zuo)用(yong)域(yu):内容(rong)与组(zu)件的“对话”

插(cha)槽(cao)的核(he)心魅力之(zhi)一在于它(ta)能(neng)够(gou)实现(xian)父子组件(jian)之(zhi)间(jian)更深层次(ci)的“对(dui)话(hua)”。父组件(jian)可以(yi)将自己的(de)数据或方(fang)法(fa)传(chuan)递(di)给子组(zu)件,并(bing)且允许子组件(jian)在特定位(wei)置(zhi)使(shi)用这(zhe)些数据或(huo)方法(fa)。这(zhe)通过“作用域(yu)插槽”(ScopedSlots)来实(shi)现。

作(zuo)用域(yu)插(cha)槽允(yun)许子组(zu)件将(jiang)自己(ji)的数(shu)据“暴露”给(gei)父(fu)组件,父(fu)组件可以在接(jie)收这些数(shu)据后(hou),在注入(ru)插槽内(nei)容(rong)时,使用这些(xie)数据。这(zhe)在需要(yao)子组件根据自(zi)身状态(tai)来(lai)渲染(ran)父组(zu)件(jian)提供(gong)的(de)部(bu)分内容(rong)时非常有(you)用。

让我们(men)继续(xu)用Card组件来(lai)演示。假(jia)设Card组件(jian)内部有一个count属(shu)性,我们希(xi)望父(fu)组件能够使用(yong)这个(ge)count来决定(ding)是(shi)否显示某(mou)个按(an)钮。

DefaultCardTitleDefaultcontent.Count:{{count}}exportdefault{data(){return{count:5};}};

在(zai)父组件中(zhong),我们(men)可以(yi)通过v-slot指令(ling),并(bing)使用一(yi)个变量来(lai)接收(shou)子(zi)组件暴露的(de)数据(ju)。

CustomCardTitle

Thecurrentcountfromthecardis:{{count}}

3">Showthisbuttonifcountisgreaterthan3

在这个例(li)子中,v-slot="{count}"告诉Vue,从子组件插(cha)槽暴露(lu)的数(shu)据中,解构(gou)出count属(shu)性,并(bing)将其(qi)赋值(zhi)给(gei)父组件模板(ban)中(zhong)的(de)count变量(liang)。这(zhe)样,父组件就(jiu)可以(yi)在自己的(de)模(mo)板(ban)中(zhong),自由(you)地(di)使(shi)用子组(zu)件提供(gong)的(de)count数(shu)据(ju)了。

注(zhu)意:

如果子组件(jian)暴露了(le)多个数(shu)据(ju),父组(zu)件可以(yi)用一个对象来(lai)接收(shou),例如(ru)v-slot="slotProps",然后(hou)在模板中使用(yong)slotProps.data1,slotProps.data2。作用(yong)域插(cha)槽的父(fu)组(zu)件(jian)注入的(de)内容,与子(zi)组(zu)件(jian)插槽(cao)自(zi)身的默(mo)认(ren)内容(rong)是互(hu)斥(chi)的。

如(ru)果父组件(jian)注(zhu)入了(le)内容,那(na)么子(zi)组件插(cha)槽的(de)默(mo)认(ren)内(nei)容就不(bu)会显示。

插槽的“舞台表演(yan)”:深入(ru)理解内容渲染与默认值

插(cha)槽机(ji)制的(de)精妙之处,还在(zai)于它(ta)如何(he)处理“内容(rong)”和(he)“默认内容”之(zhi)间的(de)关系,以及(ji)父组(zu)件(jian)如何“覆(fu)盖(gai)”子(zi)组件预设(she)的精(jing)彩(cai)。这(zhe)就像在剧院里,子组(zu)件搭(da)建了(le)一个舞台,上面可能(neng)已经准(zhun)备好(hao)了(le)一些(xie)道(dao)具(默认(ren)内(nei)容),而父组件(jian)则(ze)可(ke)以根(gen)据自(zi)己的剧本(ben),更(geng)换(huan)道具(ju)、甚(shen)至(zhi)重新(xin)编排演(yan)出。

插槽(cao)的默认(ren)内容:当(dang)“留白”遇(yu)上“预设(she)”

我们(men)已(yi)经知道(dao),在子(zi)组(zu)件的标(biao)签内可(ke)以放置(zhi)内容。这(zhe)些内容(rong),就是该(gai)插槽(cao)的(de)“默认(ren)内(nei)容(rong)”。当(dang)父(fu)组件(jian)在(zai)使用(yong)该(gai)子(zi)组件(jian)时(shi),并没有向这(zhe)个插槽(cao)提供任(ren)何(he)内(nei)容,那(na)么(me)子组件中(zhong)标(biao)签内(nei)的(de)默认内容(rong)就会(hui)被渲染(ran)出来。

还记得(de)我们之前(qian)的Card组(zu)件吗(ma)?

DefaultCardTitleDefaultfootertext.

如(ru)果(guo)我们(men)这样使(shi)用Card组件(jian),而(er)不为header和(he)footer插槽提(ti)供任何内(nei)容(rong):

Thisisthemaincontent.

此(ci)时,Card组(zu)件的渲染结(jie)果将是:

DefaultCardTitle

Thisisthemaincontent.

Defaultfootertext.

可以(yi)看(kan)到(dao),当(dang)父组件未(wei)提供内容时,子组件(jian)的默(mo)认内(nei)容就会“顶(ding)上”。这为组(zu)件(jian)的设计(ji)提(ti)供了极大(da)的(de)便(bian)利(li),我们可以(yi)为(wei)组(zu)件提(ti)供一套完(wan)整的“开箱(xiang)即(ji)用(yong)”的默认(ren)表现,同(tong)时又允许(xu)使用(yong)者根据需(xu)求进(jin)行个性化(hua)定制(zhi)。

插(cha)槽的“全(quan)覆盖(gai)”:父组件(jian)的(de)绝对控制(zhi)权

如果父(fu)组(zu)件(jian)为某(mou)个插(cha)槽提(ti)供了(le)内容(rong),那么(me)子组(zu)件在(zai)该插(cha)槽预设(she)的(de)默认(ren)内(nei)容就(jiu)会被(bei)完(wan)全(quan)“替换”,不(bu)再显示。这(zhe)是(shi)插(cha)槽最(zui)核心的“覆(fu)盖”机(ji)制。

回顾一(yi)下使用(yong)具(ju)名插槽(cao)的例子(zi):

CustomCardTitle

Thisisthemaincontentthatgoesintothedefaultslot.

当(dang)父组(zu)件提(ti)供(gong)了v-slot:header的(de)内(nei)容时(shi),Card.vue中标(biao)签内(nei)的

DefaultCardTitle

就(jiu)不会(hui)被渲染。同(tong)样,v-slot:footer的内容(rong)也会替换掉默(mo)认的(de)p标(biao)签。

插槽(cao)与(yu)作(zuo)用(yong)域插槽(cao)的“联(lian)动(dong)”:父子数据的(de)“共舞”

作用(yong)域插槽的(de)强(qiang)大(da)之处在(zai)于(yu),它不仅允许(xu)父(fu)组件(jian)向(xiang)子组件“填充(chong)”内容(rong),更允许子(zi)组件(jian)将自己的(de)“数据”或“状态”传递给父组(zu)件,让(rang)父组(zu)件在(zai)渲染这(zhe)些(xie)填(tian)充内容(rong)时(shi),能(neng)够“感(gan)知”并(bing)“利用”子组件(jian)的信息。

我(wo)们(men)再次审视作(zuo)用域插(cha)槽(cao)的例子(zi):

Defaultcontent.Count:{{count}}exportdefault{data(){return{count:5};}};Thecurrentcountfromthecardis:{{count}}3">Showthisbuttonifcountisgreaterthan3

在这(zhe)个(ge)场(chang)景下,Card组(zu)件(jian)在上使(shi)用(yong)了:count="count",将(jiang)自身的count数(shu)据传(chuan)递给了插槽。而(er)在父(fu)组(zu)件中,v-slot="{count}"解(jie)构了(le)这个传(chuan)递(di)过来的(de)count。这样(yang),父(fu)组件就可(ke)以在(zai)注入的(de)模板中(zhong),使用(yong)count来(lai)进(jin)行条(tiao)件(jian)渲染(v-if="count>3")或(huo)者显(xian)示count的值(zhi)。

这是一种非(fei)常(chang)灵(ling)活的(de)通信方式,它(ta)打(da)破了传(chuan)统父(fu)子(zi)组(zu)件通信的界(jie)限,让(rang)组(zu)件之(zhi)间(jian)的协作(zuo)更加(jia)紧(jin)密和高(gao)效。子(zi)组(zu)件可(ke)以说:“这是我的内部状(zhuang)态(tai),你可以利用它(ta)来(lai)决(jue)定如何(he)显(xian)示我(wo)提供的内(nei)容(rong)。”

特(te)殊插槽:v-slot:default和(he)v-slot:any(Vue2.6+)

在(zai)Vue2.6及以上版本(ben)中,有一个(ge)小小(xiao)的(de)细节值(zhi)得注(zhu)意。

v-slot:default(或(huo)#default):用(yong)于显式地指定内(nei)容要插入到子组件(jian)的默认插(cha)槽(cao)。虽(sui)然在(zai)大(da)多数情况下,如果(guo)父组(zu)件只有一(yi)个需(xu)要注入的内容(rong)块,并(bing)且子(zi)组件只有一个(ge)默(mo)认(ren)插槽,Vue会(hui)自动(dong)处(chu)理。但(dan)当一(yi)个组件同(tong)时(shi)包(bao)含默(mo)认插槽和(he)具(ju)名(ming)插槽(cao)时,为了(le)避(bi)免歧义,显(xian)式使(shi)用v-slot:default会更清晰。

Thisgoestothedefaultslot.

Thisgoestothenamedslot.

v-slot:any:在(zai)Vue2.6+中,当(dang)你(ni)只写v-slot而(er)不(bu)带(dai)任何(he)参数(shu)时,它就等(deng)同于(yu)v-slot:default。

Thisgoestothedefaultslot.

这个简写(xie)在(zai)父(fu)组(zu)件(jian)只向(xiang)子(zi)组件的(de)默认(ren)插槽(cao)传递内容时非(fei)常方便。

插槽的(de)“边界情(qing)况”与最(zui)佳实践

多个默(mo)认插(cha)槽:一(yi)个组(zu)件(jian)只(zhi)能(neng)有(you)一(yi)个(ge)默认插(cha)槽(cao)。如(ru)果(guo)你在(zai)一(yi)个组件(jian)中定(ding)义了(le)多个(ge)而没有name属(shu)性,Vue会(hui)将它们(men)合(he)并(bing)成一(yi)个默(mo)认插槽(cao)。未命(ming)名(ming)的(de)插槽(cao):在Vue2.6之(zhi)前,父(fu)组件(jian)向子组(zu)件(jian)传递(di)内容,但没(mei)有使(shi)用v-slot指(zhi)定(ding)具(ju)名插(cha)槽,这些(xie)内(nei)容会被插入到子组(zu)件(jian)的默认插槽(cao)中。

作(zuo)用域插(cha)槽的简(jian)洁写(xie)法:当(dang)组件只(zhi)有(you)一个(ge)插槽(cao)且是(shi)作用(yong)域(yu)插(cha)槽(cao)时,你可(ke)以直(zhi)接在组(zu)件(jian)标签上使用v-slot。例(li)如(ru):...。可读性:尽管(guan)插槽功(gong)能(neng)强大(da),但(dan)过度使用或(huo)嵌(qian)套过深(shen)的插槽可能会让(rang)组(zu)件结(jie)构(gou)变(bian)得复(fu)杂,难以理解(jie)。

在(zai)设计组件时,应(ying)权衡(heng)插槽的(de)灵(ling)活(huo)性与(yu)代码的(de)可维(wei)护(hu)性。复用(yong)性(xing):插槽的核心(xin)价(jia)值(zhi)在(zai)于提(ti)升(sheng)组件(jian)的复用性(xing)。一个设计(ji)良好(hao)的组(zu)件,应(ying)该能(neng)够通过插(cha)槽灵(ling)活(huo)地适(shi)应各种(zhong)场(chang)景(jing)。

结(jie)语:插槽(cao),Vue组件开(kai)发(fa)的“灵(ling)魂伴侣”

Vue2.x的插槽(cao)机制(zhi),是其组(zu)件(jian)化思想中不可(ke)或缺(que)的(de)闪(shan)光点(dian)。它(ta)提供(gong)了一种(zhong)优雅且(qie)高(gao)效的(de)方(fang)式,来实现组(zu)件内容(rong)的动(dong)态(tai)分发和灵活(huo)组(zu)合。从(cong)默认(ren)插槽(cao)的“简(jian)单(dan)注入”,到具名插(cha)槽的“精(jing)准投递”,再到作(zuo)用(yong)域插(cha)槽的“数据(ju)联动”,插(cha)槽层(ceng)层递进,为(wei)开发(fa)者提(ti)供(gong)了强大(da)的工具箱(xiang),让组件开发(fa)不再是(shi)僵硬的“独(du)奏(zou)”,而(er)是充(chong)满(man)活力(li)的(de)“交(jiao)响乐”。

掌握了(le)插(cha)槽,你就能更(geng)好地设(she)计(ji)出高(gao)内聚(ju)、低耦合(he)的(de)组件(jian),让你的Vue应(ying)用(yong)如(ru)同精密的(de)瑞(rui)士(shi)手表般,既强大(da)又(you)易于维(wei)护。下次当你面(mian)对(dui)组件(jian)内容传(chuan)递的(de)难(nan)题时,不(bu)妨想(xiang)想插槽(cao),它(ta)或(huo)许(xu)能为(wei)你打开一扇新的大(da)门,让(rang)你(ni)的(de)开发体(ti)验(yan),如虎添翼(yi)!

2025-11-01,gogo大胆无码无码免费衩频,上半年公募基金行业管理费收入同比增长1.37%

1.黑闰润付费内容包括哪些内容,化学制剂上市公司董秘PK:华东医药陈波薪酬增幅最大 同比涨幅达308.81%双胞胎夹心饼干动漫免费观看,哀悼!山河药辅创始人、董事长逝世

图片来源:每经记者 陈嘉佳 摄

2.男生同性恋互吃机机+美女操作逼网站,【券商聚焦】国信证券维持联想集团(00992)“优于大市”评级 指公司AI PC渗透率、手机销量快速增长

3.孙尚香正能量做钢筋图片+百度av网址大全,扬帆新材:今年光引发剂产品部分品种较去年价格有所上涨

五月综合缴情综合国产+萝莉岛黄片最新版本,摩根大通:Miran获提名担任美联储理事料将增强9月降息的可能性

51台北娜娜新作老师家访实录与反思,51台北娜娜新作老师家访背后的

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap