更新時間:2023年03月17日15時50分 來源:傳智教育 瀏覽次數(shù):
插槽(Slot)是 vue 為組件的封裝者提供的能力。允許開發(fā)者在封裝組件時,把不確定的、希望由用戶指定的部分定義為插槽。
<template> <p>這是MyCom1組件的第1個p標(biāo)簽</p> <!--通過slot標(biāo)簽,為用戶預(yù)留內(nèi)容占位符(插槽)--> <slot></slot> <p>這是MyCom1組件最后一個p標(biāo)簽</p> </template>
<my-com-1> <!-在使用 MyCom1 組件時,為插槽指定具體的內(nèi)容--> <p>~~~用戶自定義的內(nèi)容~~~</p> </my-com-1>
如果在封裝組件時沒有預(yù)留任何<slot>插槽,則用戶提供的任何自定義內(nèi)容都會被丟棄。示例代碼如下:
<template> <p>這是MyCom1組件的第1個p標(biāo)簽</p> <!--封裝組件時嗎,沒有預(yù)留任何插槽--> <p>這是MyCom1組件最后一個p標(biāo)簽</p> </templa>
<my-com-1> <!--自定義的內(nèi)容會被丟棄--> <p>~…-用戶自定義的內(nèi)容~~~</p> </my-com-1>
封裝組件時,可以為預(yù)留的插槽提供后備內(nèi)容(默認(rèn)內(nèi)容)。如果組件的使用者沒有為插槽提供任何內(nèi)容,則后備內(nèi)容會生效。示例代碼如下:
<template> <p>這是MyCom1組件的第1個p標(biāo)簽</p> <slot>這是后備內(nèi)容</slot> <p>這是MyCom1組件最后一個p標(biāo)簽</p> </template>
如果在封裝組件時需要預(yù)留多個插槽節(jié)點,則需要為每個插槽指定具體的 name 名稱。這種帶有具體名稱的插槽叫做“具名插槽”。示例代碼如下:
<div class="container"> <header> <!--我們希望把頁頭放這里--> <slot name="header"></slot> </header> <main> <!--我們希望把主要內(nèi)容放這里--> <slot></slot> </main> <footer> <!--我們希望把頁腳放這里--> <slot name="footer"></slot> </footer> </div>
注意:沒有指定 name 名稱的插槽, 會有隱含的名稱叫做 “default”。
在向具名插槽提供內(nèi)容的時候,我們可以在一個<template>元素上使用 v-slot 指令,并以 v-slot 的參數(shù)的形式提供其名稱。示例代碼如下:
<my-com-2> <template v-slot:header> <h1>滕王閣序</h1> </template> <template v-slot:default> <p>豫章故郡,洪都新府。</p> <p>星分翼,地按街廬。</p> <p>襟三江而帶五潮,控蠻荊而引甌越。</p> </template> <template v-slot:footer> <p>落款:王勃</p> </template> </my-com-2>
在封裝組件的過程中,可以為預(yù)留的插槽綁定 props 數(shù)據(jù),這種帶有 props 數(shù)據(jù)的叫做“作用域插槽”。示例代碼如下:
<tbody> <!下面的slot是一個作用域插槽--> <slot v-for="item in list":user="item"></slot> </tbody>
可以使用 v-slot: 的形式,接收作用域插槽對外提供的數(shù)據(jù)。示例代碼如下:
<my-com-3> <!--1.接收作用域插槽對外提供的數(shù)據(jù)--> <template v-slot:default="scope"> <tr> <!--2.使用作用域插槽的數(shù)據(jù)--> <td>{{scope}}</td> </tr> </template> </my-com-3>
作用域插槽對外提供的數(shù)據(jù)對象,可以使用解構(gòu)賦值簡化數(shù)據(jù)的接收過程。示例代碼如下:
<my-com-3> <!--v-slot:可以簡寫成#--> <!--作用域插槽對外提供的數(shù)據(jù)對象,可以通過“解構(gòu)賦值”簡化接收的過程--> <template #default="{user}"> <tr> <td>{{user.id}}</td> <td>{{user.name}}</td> <td>{{user.state}}</td> </tr> </template> </my-com-3>