金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

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

陶汰 2025-11-01 22:24:53

每经编辑|陶拴科    

当地时间2025-11-01,gfyuweutrbhedguifhkstebtj,龙口门户土门视频图片

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

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

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

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

在(zai)没有插槽(cao)之前(qian),如果(guo)一(yi)个(ge)父组件需(xu)要向(xiang)子组(zu)件传(chuan)递一(yi)些动态的内(nei)容(rong),我们通(tong)常(chang)会选(xuan)择props。props主(zhu)要用于(yu)传递(di)数(shu)据,当(dang)我(wo)们需要传递的(de)是(shi)一段(duan)复杂(za)的HTML结(jie)构,或者需(xu)要动态地在(zai)子组(zu)件的特定位(wei)置渲染不(bu)同(tong)的(de)内(nei)容时,props就(jiu)显(xian)得力不从心(xin)了。

父组件(jian)不得(de)不直接去(qu)操作(zuo)子组(zu)件(jian)的DOM,或者将子组件设(she)计(ji)得过(guo)于臃肿(zhong),承(cheng)担(dan)了(le)本不(bu)该它(ta)承担的(de)渲染职责(ze)。

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

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

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

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

DefaultCardTitle

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

这是Card组(zu)件的内(nei)容,可以是我(wo)想(xiang)要的任何HTML结构(gou)!点击我

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

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

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

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

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

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

让(rang)我们继续(xu)用(yong)Card组(zu)件来(lai)演示。假(jia)设(she)Card组件(jian)内部有(you)一(yi)个count属性,我们希望父(fu)组件能(neng)够(gou)使用(yong)这(zhe)个(ge)count来决定是(shi)否(fou)显示(shi)某(mou)个(ge)按(an)钮。

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

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

CustomCardTitle

Thecurrentcountfromthecardis:{{count}}

3">Showthisbuttonifcountisgreaterthan3

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

注意:

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

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

插槽(cao)的“舞(wu)台表(biao)演”:深入理解内(nei)容渲染与默认(ren)值(zhi)

插(cha)槽机(ji)制(zhi)的(de)精妙(miao)之处,还在于它(ta)如何处(chu)理(li)“内容”和“默(mo)认内容(rong)”之(zhi)间的关(guan)系,以(yi)及(ji)父组件如(ru)何“覆(fu)盖”子(zi)组件预(yu)设(she)的精彩。这就(jiu)像在剧院里,子组(zu)件搭(da)建(jian)了一个舞台(tai),上面(mian)可能(neng)已经(jing)准备好(hao)了(le)一些(xie)道具(默(mo)认(ren)内容),而父组件(jian)则可以根据自(zi)己(ji)的(de)剧(ju)本,更换道具(ju)、甚(shen)至(zhi)重新(xin)编排(pai)演出(chu)。

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

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

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

DefaultCardTitleDefaultfootertext.

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

Thisisthemaincontent.

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

DefaultCardTitle

Thisisthemaincontent.

Defaultfootertext.

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

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

如果(guo)父(fu)组件(jian)为(wei)某(mou)个插槽提供了内(nei)容(rong),那么(me)子组(zu)件在(zai)该插(cha)槽(cao)预设的默(mo)认内(nei)容(rong)就会(hui)被完(wan)全(quan)“替换”,不(bu)再显(xian)示。这是插(cha)槽(cao)最(zui)核(he)心(xin)的“覆(fu)盖”机制。

回(hui)顾一下使用(yong)具名插(cha)槽的(de)例子:

CustomCardTitle

Thisisthemaincontentthatgoesintothedefaultslot.

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

DefaultCardTitle

就(jiu)不会被渲染。同样,v-slot:footer的内容也(ye)会替换(huan)掉默(mo)认的p标签(qian)。

插槽与作用域插槽(cao)的“联动”:父子数(shu)据的“共(gong)舞”

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

我们再次(ci)审视作用(yong)域插(cha)槽的例子(zi):

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

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

这是一种非(fei)常灵(ling)活的(de)通信(xin)方(fang)式,它打破了(le)传(chuan)统父子(zi)组件(jian)通信的界(jie)限,让(rang)组件(jian)之间(jian)的协作(zuo)更加紧(jin)密和(he)高效。子组(zu)件可(ke)以(yi)说(shuo):“这是我的(de)内部状态(tai),你(ni)可以(yi)利(li)用(yong)它(ta)来决(jue)定(ding)如(ru)何显(xian)示我提供(gong)的内(nei)容。”

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

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

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

Thisgoestothedefaultslot.

Thisgoestothenamedslot.

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

Thisgoestothedefaultslot.

这(zhe)个简(jian)写在父(fu)组(zu)件(jian)只向(xiang)子组件的(de)默认插槽(cao)传递(di)内容时(shi)非常方(fang)便。

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

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

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

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

结语(yu):插槽(cao),Vue组件(jian)开(kai)发的(de)“灵魂伴(ban)侣”

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

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

2025-11-01,唐三把手放在宁荣荣哪里,一场白宫“鸿门宴”

1.100块流氓软件免费下载安装中国P站,资产配置首选股票!险资下半年展望来了上海少女老外视频大全,杭州银行:股东红狮集团解除协议转让公司股份

图片来源:每经记者 陈胜兴 摄

2.黑人系列+东京热av破解版,“特朗普2.0”下,对冲基金经理的糟心的一天

3.国产精品 ~ 春水+蝴蝶效应滚沙发两人深情表白,伦敦出手整治:外放手机声音将罚款近1万元 行为让人厌恶

不见星空全集完整初雪在线观看免费版+夏晴子MV免费在线观看,年度净利连降、实控人手握超九成表决权,锡华科技IPO迎考

黑土大雷漫画本,爆笑剧情,热血冒险,不容错过的精彩故事

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

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

读者热线:4008890008

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

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap