您好,登錄后才能下訂單哦!
這篇文章主要介紹了Vue中的插槽是什么及怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Vue中的插槽是什么及怎么用文章都會有所收獲,下面我們一起來看看吧。
在 Vue 中,插槽是個很強大的功能,它可以使封裝的組件靈活性增強很多,比如你在封裝一個組件時使用了插槽,那在父組件調用時,這里的內容就可以由父組件自由定義,而無需在封裝組件時苦想如何覆蓋各種使用場景。
假設我們現在有一個需要封裝的組件 SlotComponent
<template> <div>這是一個slot:<slot> </slot></div> </template>
<SlotComponent>來自父組件的內容</SlotComponent>
在 slot
中的內容就可以在父組件中任意定義。要是組件中沒有<slot>
元素,那么在父組件調用時,組件起始和結束標簽之間的內容就都會丟失掉。
既然 slot
是在 SlotComponent
組件中的,那在父組件中調用的時候能否能使用 SlotComponent
組件里的數據呢 ? 顯然是不能的,因為他們所處的作用域并不相同。
父級模板里的所有內容都是在父級作用域中編譯的;子模板里的所有內容都是在子作用域中編譯的。
插槽也可以設置默認的內容,這有點像 es6
中函數參數的默認值,當父組件調用時并沒有提供內容,那么這個默認值就會被渲染出來。提供了內容的話,則會替代默認內容。
<template> <div> <slot>這是slot的默認內容</slot> </div> </template>
<DefaultSlot></DefaultSlot>
在調用時標簽之間并沒有提供內容,默認值得以渲染,成為一個兜底內容。
如果在組件中我需要多個地方用到插槽,那就需要給 slot
添加 name
,來區分內容渲染到什么地方。
// named slot,名字叫 NamedSlot <template> <div> 這是具名插槽 <div> <slot name="slot1"></slot> </div> <div> <slot name="slot2"></slot> </div> <div> <slot name="slot3"></slot> </div> </div> </template> // 在父組件中調用 <NamedSlot> <template v-slot:slot1>這是插入slot1的內容</template> <template v-slot:slot2>這是插入slot2的內容</template> <template v-slot:slot3>這是插入slot3的內容</template> </NamedSlot>
給 slot
加上 name
屬性后,可以通過 v-slot:slotName
的形式分發內容。不給 name
屬性的話,就默認name
為 default
,等同于 v-slot:default
,也可以縮寫為#default
。
注意, v-slot
只能添加在 <template>
上 ,但是也有特殊情況,后面會講到。
通過 slot
,我們可以在父組件為子組件添加內容,但是父子組件的作用域是不同的,我們想在父組件使用子組件的數據該怎么辦呢?
可以在子組件 <slot>
元素上綁定屬性,值為你需要傳遞給父組件的內容。
// 子組件 組件名稱為 SlotProp <div> <slot name="slot1" :value1="child1"></slot> <slot name="slot2" :value2="child2"></slot> </div> //調用 <SlotProp> <template v-slot:slot1="slotProps"> {{ slotProps.value1 }} </template> <template v-slot:slot2="slotProps"> {{ slotProps.value2 }} </template> </SlotProp>
簡單來說,就是在 slot
上通過 :key='value'
的形式綁定一個值,
在父組件調用時,通過v-slot:slotName="slotProps"
的形式拿到這個值,slotProps
名稱可以自己定義,
再通過 slotProps[key]
去拿到這個值。
如果組件只有一個默認模版的話,是可以不用在 template
上寫 v-slot:slotName="slotProps"
的,可以直接在組件名稱上寫 v-slot
<SlotProp v-slot:default="slotProps"> {{ slotProps.value1 }} </SlotProp>
上面提到過,未指定 name
就會被認為是 default
,這里也是同理,v-slot:default="slotProps"
可以簡寫成 v-slot="slotProps"
。
作用域插槽的內部工作原理是將你的插槽內容包括在一個傳入單個參數的函數里
基于插槽的實現原理,我們也可以使用一些 ES6
的語法來操作 slotProps
,比如解構,prop重命名和賦默認值等。
// 解構 <SlotProp v-slot="{ value1 }"> {{ value1 }} </SlotProp> // 重命名,將 value1 重命名為 name1 <SlotProp v-slot="{ value1: name1 }"> {{ name1 }} </SlotProp> // 賦默認值 <SlotProp v-slot="{ value1 = '這是默認值' }"> {{ value1 }} </SlotProp>
slot
支持通過 <template v-slot:[dynamicSlotName]>
這樣的方式來實現動態插槽。
有時在一個基礎組件中循環了插入了多個 slot
,比如這樣
<div v-for="item in slotList" :key="item"> <slot :name="item"></slot> </div>
在調用的時候就可以使用動態插槽名 + 循環來動態渲染相應的 slot
<template v-for="item in slotList" v-slot:[item] > {{item}} </template>
關于“Vue中的插槽是什么及怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Vue中的插槽是什么及怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。